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; }
}