.net core Mongodb 操作类库封装

 public class MongoDBProvider<T>  where T : class
    {
        private IMongoDatabase _db;

        public string CollectionName { get; set; }

        private static ConcurrentDictionary<string, string> dic = new ConcurrentDictionary<string, string>();
        private static ConcurrentDictionary<string, string> diccollection = new ConcurrentDictionary<string, string>();
        /// <summary>
        /// 获取Mongodb要链接的 DatabaseName
        /// </summary>
        /// <param name="DatabaseName"></param>
        /// <returns></returns>
        public string GetDatabaseName(string dataBaseName)
        {
            if (!string.IsNullOrEmpty(dataBaseName))
            {
                return dataBaseName;
            }
            else
            {
                return dic.GetOrAdd(typeof(T).Name, p => {
                    var attribute = typeof(T).GetAttribute<DatabaseNameAttribute>();
                    if (attribute != null && !string.IsNullOrEmpty(attribute.DatabaseName))
                    {
                        return attribute.DatabaseName;
                    }
                    return "";
                });
            }
        }

        /// <summary>
        /// 实例化MongoDB提供者
        /// </summary>
        /// <param name="connectionName">要连接的字符串标识</param>
        /// <param name="dataBaseName">要连接的mongodb databasename</param>
        public MongoDBProvider(string connectionName, string dataBaseName = null,string collectionName=null)
        {
            Assert.NotNull(connectionName, nameof(connectionName));
            CollectionName = collectionName;
            var connectionString = dic.GetOrAdd(connectionName, p => {
                var configuration = IocManager.ServiceProvider?.GetRequiredService<IConfiguration>();
                return configuration[$"ConnectionStrings:{connectionName}"];
            });
            //获取Mongodb要链接的 DatabaseName
            dataBaseName = GetDatabaseName(dataBaseName);
            string concatkey = string.Concat(connectionName, dataBaseName, collectionName);
            var connectionManager = new MongoDBConnectionManager();
            if (!connectionManager.Exists(concatkey))
            {
                MongoUrl mongoUrl = new MongoUrl(connectionString);
                MongoClientSettings settings = MongoClientSettings.FromUrl(mongoUrl);
                MongoClient client = new MongoClient(settings);
                if (string.IsNullOrEmpty(dataBaseName))
                {
                    dataBaseName = mongoUrl.DatabaseName;
                }
                _db = client.GetDatabase(dataBaseName);
                connectionManager.Add(concatkey, _db);
            }
            _db = connectionManager.GetConnection(concatkey);
        }


        /// <summary>
        /// 获取一个Mongodb 链接
        /// </summary>
        /// <returns></returns>
        public IMongoCollection<T> GetCollection()
        {
            if (!string.IsNullOrEmpty(CollectionName))
            {
                return _db.GetCollection<T>(CollectionName);
            }
            else {
               var collectionName = diccollection.GetOrAdd(typeof(T).Name, p =>
                {
                    var attribute = typeof(T).GetAttribute<DatabaseNameAttribute>();
                    if (attribute != null && !string.IsNullOrEmpty(attribute.CollectionName))
                    {
                        return attribute.CollectionName;
                    }
                    return typeof(T).Name;
                });
                return _db.GetCollection<T>(collectionName);
            }
        }


        /// <summary>
        /// 获取一个Mongodb 链接
        /// </summary>
        /// <returns></returns>
        public IMongoCollection<BsonDocument> GetBsonDocumentCollection()
        {
            if (!string.IsNullOrEmpty(CollectionName))
            {
                return _db.GetCollection<BsonDocument>(CollectionName);
            }
            else
            {
                var collectionName = diccollection.GetOrAdd(typeof(T).Name, p =>
                {
                    var attribute = typeof(T).GetAttribute<DatabaseNameAttribute>();
                    if (attribute != null && !string.IsNullOrEmpty(attribute.CollectionName))
                    {
                        return attribute.CollectionName;
                    }
                    return typeof(T).Name;
                });
                return _db.GetCollection<BsonDocument>(collectionName);
            }
        }


        public void Add(T entity)
        {
            GetCollection().InsertOne(entity);
        }
        public void Add(BsonDocument entity)
        {
            GetBsonDocumentCollection().InsertOne(entity);
        }

        public void AddList(List<T> entities)
        {

            GetCollection().InsertMany(entities);
        }
        public void AddList(List<BsonDocument> entities)
        {
            GetBsonDocumentCollection().InsertMany(entities);
        }

        public bool DeleteById(params object[] entityIds)
        {
                Dictionary<string, ObjectId> dicts = new Dictionary<string, ObjectId>();
                for (int i = 0; i < entityIds.Length; i++)
                {
                    dicts.Add("_id",new ObjectId(entityIds[i].ToString()));
                }
                var result = GetCollection().DeleteOne(new BsonDocument(dicts));
                return result != null && result.DeletedCount > 0;
        }

        /// <summary>
        /// 根据指定对象的ID,从数据库中删除指定指定的对象
        /// </summary>
        /// <param name="idList">对象的ID集合</param>
        /// <returns>执行成功返回<c>true</c>,否则为<c>false</c></returns>
        public bool DeleteBatch(List<string> idList)
        {
            if (idList == null || idList.Count == 0)
            {
                throw new ArgumentException();
            }
            var  newidList = idList.Select(p => { return new ObjectId(p); });
            var builder = Builders<BsonDocument>.Filter;
            var filter = builder.AnyIn("_id", new BsonArray(newidList));
            var result = GetBsonDocumentCollection().DeleteMany(filter);
            return result != null && result.DeletedCount > 0;
        }
        public bool DeleteByQuery(Expression<Func<T, bool>> condition)
        {

            var result = GetCollection().DeleteMany(condition);
            return result != null && result.DeletedCount > 0;
        }
        public bool DeleteByQuery(FilterDefinition<BsonDocument> query)
        {
            var result = GetBsonDocumentCollection().DeleteMany(query);
            return result != null && result.DeletedCount > 0;
        }

        
        public bool Save(T entity)
        {
            Dictionary<string, ObjectId> dicts = new Dictionary<string, ObjectId>();
            List<MapperPropertyInfo> keys;
            if (PropertyInfoHelper.TryGetPrimaryKeys<T>(entity, out keys))
            {
                for (int i = 0; i < keys.Count; i++)
                {
                    dicts.Add("_id", new ObjectId(keys[i].Value.ToString()));
                }
                var update = GetBsonDocumentCollection().ReplaceOne(new BsonDocument(dicts), entity.ToBsonDocument());
                return (update != null && update.ModifiedCount > 0);
            }
            return false;
        }

        public bool ReplaceOne(BsonDocument t, string id)
        {
            if (t == null)
            {
                throw new ArgumentException();
            }
            if (string.IsNullOrEmpty(id))
            {
                throw new ArgumentException("传入的对象id为空", id);
            }
            bool result = false;
            var doc = new BsonDocument { { "_id", new ObjectId(id) } };
            //使用 IsUpsert = true ,如果没有记录则写入
            var update = GetBsonDocumentCollection().ReplaceOne(doc, t);
            result = update != null && update.ModifiedCount > 0;
            return result;
        }



        public bool UpdateOne(FilterDefinition<T> filter, UpdateDefinition<T> update)
        {
            var upresult = GetCollection().UpdateOne(filter, update);
            return upresult != null && upresult.ModifiedCount > 0;
        }

        //public bool UpdateOneBson(FilterDefinition<BsonDocument> filter, UpdateDefinition<BsonDocument> update)
        //{
        //    var upresult = GetBsonDocumentCollection().UpdateOne(filter, update);
        //    return upresult != null && upresult.ModifiedCount > 0;
        //}


        public bool UpdateMany(FilterDefinition<T> filter, UpdateDefinition<T> update)
        {
            var upresult = GetCollection().UpdateMany(filter, update);
            return upresult != null && upresult.ModifiedCount > 0;
        }

        public T GetById(params object[] entityIds)
        {
                Dictionary<string, ObjectId> dicts = new Dictionary<string, ObjectId>();
                for (int i = 0; i < entityIds.Length; i++)
                {
                    dicts.Add("_id", new ObjectId(entityIds[i].ToString()));
                }
                return GetCollection().Find(new BsonDocument(dicts)).FirstOrDefault();
        }

        public BsonDocument GetBsonDocumentById(params object[] entityIds)
        {
            Dictionary<string, ObjectId> dicts = new Dictionary<string, ObjectId>();
            for (int i = 0; i < entityIds.Length; i++)
            {
                dicts.Add("_id", new ObjectId(entityIds[i].ToString()));
            }
            return GetBsonDocumentCollection().Find(new BsonDocument(dicts)).FirstOrDefault();
        }

        /// <summary>
        /// 通过表达式数查询
        /// </summary>
        /// <param name="condition"></param>
        /// <returns></returns>
        public T GetItemByQuery(Expression<Func<T, bool>> condition)
        {
            
            return GetCollection().Find(condition).FirstOrDefault();
        }

        /// <summary>
        /// 通过
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public BsonDocument GetItemByQuery(FilterDefinition<BsonDocument> filter)
        {
            return GetBsonDocumentCollection().Find(filter).FirstOrDefault();
        }


        public int GetCountByQuery(Expression<Func<T, bool>> condition)
        {
            
            return (int)GetCollection().CountDocuments(condition);
        }

        public int GetCountByQuery(FilterDefinition<BsonDocument> filter)
        {
            return (int)GetBsonDocumentCollection().CountDocuments(filter);
        }


        public List<T> GetListByQuery(Expression<Func<T, bool>> condition)
        {
            return GetCollection().Find(condition).ToList();
        }

        public List<T> GetListByQuery(Expression<Func<T, bool>> condition, Expression<Func<T, object>> field, bool isDesc)
        {
            
            if (isDesc)
            {
                return GetCollection().Find(condition).SortByDescending(field).ToList();
            }
            else
            {
                return GetCollection().Find(condition).SortBy(field).ToList();
            }
        }

        public List<BsonDocument> GetListByQuery(FilterDefinition<BsonDocument> filter)
        {
            return GetBsonDocumentCollection().Find(filter).ToList();
        }

        public List<BsonDocument> GetListByQuery(FilterDefinition<BsonDocument> filter, string orderBy, bool isDesc)
        {

            var queryable =GetBsonDocumentCollection().Find(filter);
            var sort = isDesc ? Builders<BsonDocument>.Sort.Descending(orderBy) : Builders<BsonDocument>.Sort.Ascending(orderBy);
            return queryable.Sort(sort).ToList();
        }


        public virtual List<BsonDocument> GetAllData()
        {
            return GetBsonDocumentCollection().AsQueryable().ToList();
        }

        public virtual List<T> GetAllListData()
        {

            return GetCollection().AsQueryable().ToList();
        }


        public bool IsExists(Expression<Func<T, bool>> condition)
        {
            return GetCollection().Find(condition).FirstOrDefault() != null;
        }
        public bool IsExists(FilterDefinition<BsonDocument> filter)
        {
            return GetBsonDocumentCollection().Find(filter).FirstOrDefault() != null;
        }


        public List<T> GetTopNByQuery(Expression<Func<T, bool>> condition, int number, string orderBy, bool isDesc)
        {
            if (isDesc)
            {
                return GetCollection().Find(condition).SortByDescending(p => orderBy).Limit(number).ToList();
            }
            else
            {
                return GetCollection().Find(condition).SortBy(p => orderBy).Limit(number).ToList();
            }
        }

        public List<BsonDocument> GetTopNByQuery(FilterDefinition<BsonDocument> filter, int number, string orderBy, bool isDesc)
        {
            if (isDesc)
            {
                return GetBsonDocumentCollection().Find(filter).SortByDescending(p => orderBy).Limit(number).ToList();
            }
            else
            {
                return GetBsonDocumentCollection().Find(filter).SortBy(p => orderBy).Limit(number).ToList();
            }
        }


        public List<T> GetPagedList(int offset, int limit, Expression<Func<T, bool>> condition, Expression<Func<T, object>> field, bool isDesc, out int total)
        {
            
            total = (int)GetCollection().Count(condition);
            List<T> list = new List<T>();
            if (isDesc)
            {
                list = GetCollection().Find(condition).SortByDescending(field).Skip(offset).Limit(limit).ToList();
            }
            else
            {
                list = GetCollection().Find(condition).SortBy(field).Skip(offset).Limit(limit).ToList();
            }
            return list;
        }

        public List<BsonDocument> GetPagedList(int offset, int limit, FilterDefinition<BsonDocument> filter, string orderBy, bool isDesc, out int total)
        {
            total = (int)GetBsonDocumentCollection().CountDocuments(filter);

            var queryable = GetBsonDocumentCollection().Find(filter);
            var sort = isDesc ? Builders<BsonDocument>.Sort.Descending(orderBy) : Builders<BsonDocument>.Sort.Ascending(orderBy);
            return queryable.Sort(sort).Skip(offset).Limit(limit).ToList();
            //List<BsonDocument> list = new List<BsonDocument>();
            //if (isDesc)
            //{
            //    list = GetBsonDocumentCollection().Find(filter).SortByDescending(p => orderBy).Skip(offset).Limit(limit).ToList();
            //}
            //else
            //{
            //    list = GetBsonDocumentCollection().Find(filter).SortBy(p => orderBy).Skip(offset).Limit(limit).ToList();
            //}
            //return list;
        }



        public List<TResult> GetAggregateData<TResult>(PipelineDefinition<T, TResult> pipeLine)
        {
            return GetCollection().Aggregate<TResult>(pipeLine).ToList();
        }
        public List<BsonDocument> GetAggregateData(PipelineDefinition<BsonDocument, BsonDocument> pipeLine)
        {
            return GetBsonDocumentCollection().Aggregate<BsonDocument>(pipeLine).ToList();
        }


    }
 public class DatabaseNameAttribute : Attribute
    {

        public string DatabaseName
        {
            get;

            set;
        }
        public string CollectionName
        {
            get;

            set;
        }
    }
appsettings连接串:

"ConnectionStrings": {
      "MongodbUrl": "mongodb://localhost:27017/xxx",
}
测试示例:    
        MongoDBProvider<PersonMongo> mongoDBProvider = new MongoDBProvider<PersonMongo>("MongodbUrl");

            List<PersonMongo> list = new List<PersonMongo>();
            List<BsonDocument> listbson = new List<BsonDocument>();
            for (int i = 1; i < 200; i++)
            {
 

 


                list.Add(new PersonMongo() { Age = i + 110, Name = "11" + i, State = true, Test = i });

                listbson.Add(new BsonDocument { { "Age", i + 100 }, { "Name", "BsonDocument11" + i }, { "State", true }, { "Test", i } });
            }
            mongoDBProvider.Add(new PersonMongo() { Age = 100000, Name = "1单个添加", State = true, Test = 100000 });
            mongoDBProvider.Add(new PersonMongo() { Age = 100000, Name = "1单个添加", State = true, Test = 100000 });
            mongoDBProvider.AddList(list);
            mongoDBProvider.AddList(listbson);
            mongoDBProvider.Add(new BsonDocument { { "Age", 100000 }, { "Name", "BsonDocument1单个添加" }, { "State", true } });


            var aaa = mongoDBProvider.GetById("5f741ae43002da750b1043c6");

            var bbb = mongoDBProvider.GetById("5f741b1d3002da750b104490");


            var count = mongoDBProvider.GetCountByQuery(p => p.Name == "1单个添加");

            var filter = Builders<BsonDocument>.Filter.Eq("Name", "BsonDocument1单个添加");
            count = mongoDBProvider.GetCountByQuery(filter);

            var allData = mongoDBProvider.GetAllData();
            var allData1 = mongoDBProvider.GetAllListData();
            var item = mongoDBProvider.GetItemByQuery(p => p.Name == "高建东10" && p.Test == 10);



            var builder = Builders<BsonDocument>.Filter;
            var aaaa = builder.And(builder.Eq("Name", "1"), builder.Eq("Test", 10));
            var item1 = mongoDBProvider.GetItemByQuery(aaaa);

            var num2 = mongoDBProvider.GetListByQuery(p => p.Age == 100000);

            var num1 = mongoDBProvider.GetListByQuery(builder.Eq("Age", 100000));

            var bbbbb = mongoDBProvider.GetListByQuery(p => p.Test == 5, p => p.Age
        , true);
            filter = Builders<BsonDocument>.Filter.Eq("Test", 5);

            var del = mongoDBProvider.DeleteById("5f7f1356a0515a0f1df043ef");
            var a = mongoDBProvider.GetItemByQuery(p => p._id == "5f7f1356a0515a0f1df043ed");
 public class PersonMongo
    {

        public PersonMongo()
        {
            this.CreateTime = DateTime.Now;
            this.CreateUser = "xxxx";
            this.UpdateTime = DateTime.Now;
            this.UpdateUser = "xxxx";
        }


        [Key]
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string _id { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public DateTime CreateTime { get; set; }

        public string CreateUser { get; set; }

        public DateTime UpdateTime { get; set; }

        public string UpdateUser { get; set; }

        public bool DelFlag { get; set; }

        public bool State { get; set; }

        public int? Test { get; set; }

    }

 

posted @ 2020-11-23 09:39  gaojiandong  阅读(819)  评论(0)    收藏  举报