隐藏

C#封装MongoDB工具类库

发布:2023/7/6 14:34:53作者:管理员 来源:本站 浏览次数:1203

什么是MongoDB


MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。



MongoDB安装


园内很多教程,比较详细的在这里



工具类说明


1、基于MongoDB.Driver封装MongoDB的一些基本操作


2、利用反射每个实体类名作为存储数据的表名


3、数据ID自增使用MongoDB自带的ObjectID



MongoDB连接类


//实例化对象 类名保存为MongoDB表名称

MongoDBUtil<PlayerEntity> mgdbUtil = new MongoDBUtil<PlayerEntity>();

//清空数据

mgdbUtil.DeleteAll();

//插入一条数据

PlayerEntity t = new PlayerEntity() { NId = 1, Name = "曾城", Birthday = DateTime.Parse("1900-1-1"), CountryName = "中国", Club = "广州恒大", Position = "GK" };

mgdbUtil.Insert(t);

//更新一条数据

PlayerEntity t2 = new PlayerEntity() { NId = 1, Name = "曾城update", Birthday = DateTime.Now, CountryName = "中国", Club = "广州恒大", Position = "GK" };

mgdbUtil.Update(t2, s => s.NId == 1);

//查询一条数据

var m = mgdbUtil.GetEntity(s => s.NId == 1);

Console.WriteLine(JsonUtil.Serialize(m));

//删除一条数据

mgdbUtil.Delete(s => s.NId == 1);



MongoDBUtil连接类




public class MongoDB

    {

        private static string connStr = ConfigUtil.GetValue(SysConstant._MongoDBConnection);


        private static string dbName = ConfigUtil.GetValue(SysConstant._MongoDB);


        private static IMongoDatabase db = null;


        private static readonly object lockHelper = new object();


        private MongoDB()

        {

        }


        /// <summary>

        /// 创建DB

        /// </summary>

        /// <returns></returns>

        public static IMongoDatabase CreateDB()

        {

            if (db == null)

            {

                lock (lockHelper)

                {

                    if (db == null)

                    {

                        var client = new MongoClient(connStr);

                        db = client.GetDatabase(dbName);

                    }

                }

            }

            return db;

        }

    }



MongoDBUtil数据操作类


public class MongoDBUtil<T> where T : BaseEntity

    {

        private IMongoDatabase db = null;

        private IMongoCollection<T> collection = null;


        public MongoDBUtil()

        {

            this.db = MongoDB.CreateDB();

            collection = db.GetCollection<T>(typeof(T).Name);

        }


        /// <summary>

        /// 添加一条对象记录

        /// </summary>

        /// <param name="entity"></param>

        /// <returns></returns>

        public T Insert(T entity)

        {

            entity.Id = ObjectId.GenerateNewId();

            collection.InsertOne(entity);

            return entity;

        }


        /// <summary>

        /// 根据ID更新一条记录  

        /// </summary>

        /// <param name="id"></param>

        /// <param name="field"></param>

        /// <param name="value"></param>

        public void Update(string id, string field, string value)

        {

            var filter = Builders<T>.Filter.Eq("Id", id);

            var updated = Builders<T>.Update.Set(field, value);

            UpdateResult result = collection.UpdateOneAsync(filter, updated).Result;

        }


        /// <summary>

        /// 根据ID更新一条记录

        /// </summary>

        /// <param name="entity"></param>

        /// <param name="id"></param>

        public void Update(T entity, string id)

        {

            Update(entity, a => a.Id == ObjectId.Parse(id));

        }


        /// <summary>

        /// 根据条件更新一条记录

        /// </summary>

        /// <param name="entity"></param>

        /// <param name="func"></param>

        public void Update(T entity, Expression<Func<T, bool>> func)

        {

            var old = GetEntity(func);

            foreach (var prop in entity.GetType().GetProperties())

            {

                if (prop.Name.Equals("Id"))

                    continue;

                var newValue = prop.GetValue(entity);

                var oldValue = old.GetType().GetProperty(prop.Name).GetValue(old);

                if (newValue != null)

                {

                    if (!newValue.ToString().Equals(oldValue.ToString()))

                    {

                        old.GetType().GetProperty(prop.Name).SetValue(old, newValue);

                    }

                }

            }

            collection.ReplaceOne(func, old);

        }


        /// <summary>

        /// 根据ID获取对象

        /// </summary>

        /// <param name="id"></param>

        /// <returns></returns>

        public T GetEntity(string id)

        {

            return collection.Find(a => a.Id == ObjectId.Parse(id)).ToList().FirstOrDefault();

        }


        /// <summary>

        /// Lambar 表达式选择一个模型

        /// </summary>

        /// <param name="func"></param>

        /// <returns></returns>

        public T GetEntity(Expression<Func<T, bool>> func)

        {

            return collection.Find(func).ToList().FirstOrDefault();

        }


        /// <summary>

        /// 获取全部信息

        /// </summary>

        /// <returns></returns>

        public List<T> ListAll()

        {

            return ListByCondition(s => 1 == 1);

        }


        /// <summary>

        /// 根据条件筛选列表

        /// </summary>

        /// <param name="func"></param>

        /// <returns></returns>

        public List<T> ListByCondition(Expression<Func<T, bool>> func)

        {

            return collection.Find(func).ToList<T>();

        }


        /// <summary>

        /// 获取列表

        /// </summary>

        /// <param name="func"></param>

        /// <param name="count">数量</param>

        /// <returns></returns>

        public List<T> ListByCondition(Expression<Func<T, bool>> func, int count)

        {

            return collection.Find(func).Limit(count).ToList();

        }


        /// <summary>

        /// 获取分页列表

        /// </summary>

        /// <param name="func"></param>

        /// <param name="page"></param>

        /// <param name="pageSize"></param>

        /// <param name="record"></param>

        /// <param name="sort"></param>

        /// <returns></returns>

        public List<T> ListPage(Expression<Func<T, bool>> func, int page, int pageSize, ref long record, SortDefinition<T> sort = null)

        {

            record = collection.Count(func);

            return collection.Find(func).Sort(sort).Skip((page - 1) * pageSize).Limit(pageSize).ToList();

        }


        /// <summary>

        /// 删除数据

        /// </summary>

        /// <param name="func"></param>

        /// <returns></returns>

        public long Delete(Expression<Func<T, bool>> func)

        {

            return collection.DeleteMany(func).DeletedCount;

        }


        /// <summary>

        /// 删除全部

        /// </summary>

        /// <returns></returns>

        public long DeleteAll()

        {

            return Delete(s => 1 == 1);

        }

    }



问题:


   目前数据Id自增采用MongoDB默认ObjectId,暂未实现自定义自增解决方案


   MongoDB 日期类型保存为UTC格式,

   例:本地时间(8时区)2017-03-30 15:00:00 MongoDB保存为(格林尼治时间):ISODate("2017-03-30T07:00:00.000Z")

   相差8小时



测试结果:






Github开源地址:https://github.com/willianchen/CML.MongoDB