using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Core.Events; using MongoDB.Driver.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; namespace Masuit.Tools.NoSQL.MongoDBClient { public class MongoDbClient { public MongoClient Client { get; set; } public IMongoDatabase Database { get; set; } private MongoDbClient(string url, string database) : this(MongoClientSettings.FromConnectionString(url), database) { } private MongoDbClient(MongoClientSettings settings, string database) { settings.ClusterConfigurator = cb => { cb.Subscribe(e => { Console.WriteLine($"{e.CommandName} - {e.Command.ToJson()}"); }); }; Client = new MongoClient(settings); Database = Client.GetDatabase(database); } /// /// 获取mongo单例 /// /// 连接字符串 /// 数据库 /// public static MongoDbClient GetInstance(string url, string database) { return new MongoDbClient(url, database); } /// /// 获取mongo线程内唯一对象 /// /// 连接字符串 /// 数据库 /// public static MongoDbClient ThreadLocalInstance(string url, string database) { MongoDbClient instance; if (CallContext.GetData(url + database) == null) { instance = new MongoDbClient(url, database); CallContext.SetData(url + database, instance); } instance = CallContext.GetData(url + database); return instance; } /// /// 获取表 /// /// /// 表名 /// public IMongoCollection GetCollection(string collection) { return Database.GetCollection(collection); } #region 插入 /// /// 插入一条数据 /// /// /// 表名 /// 数据 public void InsertOne(string collection, T t) { Database.GetCollection(collection).InsertOne(t); } /// /// 插入一条数据 /// /// 表名 /// 文档 public void InsertOne(string collection, BsonDocument doc) { Database.GetCollection(collection).InsertOne(doc); } /// /// 插入一条数据 /// /// /// 表名 /// 数据 public Task InsertOneAsync(string collection, T t, CancellationToken cancellationToken = default) { return Database.GetCollection(collection).InsertOneAsync(t, cancellationToken: cancellationToken); } /// /// 插入一条数据 /// /// 表名 /// 文档 public Task InsertOneAsync(string collection, BsonDocument doc, CancellationToken cancellationToken = default) { return Database.GetCollection(collection).InsertOneAsync(doc, cancellationToken: cancellationToken); } /// /// 插入多条数据 /// /// /// 表名 /// 集合 public void InsertMany(string collection, IEnumerable list) { Database.GetCollection(collection).InsertMany(list); } /// /// 插入多条数据 /// /// 表名 /// Bson集合 public void InsertMany(string collection, IEnumerable list) { Database.GetCollection(collection).InsertMany(list); } /// /// 插入多条数据 /// /// /// 表名 /// 集合 public Task InsertManyAsync(string collection, IEnumerable list, CancellationToken cancellationToken = default) { return Database.GetCollection(collection).InsertManyAsync(list, cancellationToken: cancellationToken); } /// /// 插入多条数据 /// /// 表名 /// Bson集合 public Task InsertManyAsync(string collection, IEnumerable list, CancellationToken cancellationToken = default) { return Database.GetCollection(collection).InsertManyAsync(list, cancellationToken: cancellationToken); } /// /// 大批量插入数据 /// /// /// 表名 /// 数据集合 /// public List> BulkInsert(string collection, IEnumerable> list) { BulkWriteResult result = Database.GetCollection(collection).BulkWrite(list); return result.ProcessedRequests.ToList(); } /// /// 大批量插入数据 /// /// 表名 /// Bson数据集合 /// public List> BulkInsert(string collection, IEnumerable> list) { BulkWriteResult result = Database.GetCollection(collection).BulkWrite(list); return result.ProcessedRequests.ToList(); } /// /// 大批量插入数据 /// /// /// 表名 /// 数据集合 /// public async Task>> BulkInsertAsync(string collection, IEnumerable> list, CancellationToken cancellationToken = default) { BulkWriteResult result = await Database.GetCollection(collection).BulkWriteAsync(list, cancellationToken: cancellationToken); return result.ProcessedRequests.ToList(); } /// /// 大批量插入数据 /// /// 表名 /// Bson数据集合 /// public async Task>> BulkInsertAsync(string collection, IEnumerable> list, CancellationToken cancellationToken = default) { BulkWriteResult result = await Database.GetCollection(collection).BulkWriteAsync(list, cancellationToken: cancellationToken); return result.ProcessedRequests.ToList(); } #endregion 插入 #region 更新 /// /// 修改一条数据 /// /// /// 表名 /// 条件 /// 更新的数据 /// 如果它不存在是否插入文档 /// public UpdateResult UpdateOne(string collection, Expression> filter, UpdateDefinition update, bool upsert) { return Database.GetCollection(collection).UpdateOne(filter, update, new UpdateOptions() { IsUpsert = upsert }); } /// /// 修改一条数据 /// /// 表名 /// 条件 /// 更新的数据 /// 如果它不存在是否插入文档 /// public UpdateResult UpdateOne(string collection, Expression> filter, UpdateDefinition update, bool upsert) { return Database.GetCollection(collection).UpdateOne(filter, update, new UpdateOptions() { IsUpsert = upsert }); } /// /// 修改一条数据 /// /// /// 表名 /// 条件 /// 更新的数据 /// 如果它不存在是否插入文档 /// public async Task UpdateOneAsync(string collection, Expression> filter, UpdateDefinition update, bool upsert, CancellationToken cancellationToken = default) { return await Database.GetCollection(collection).UpdateOneAsync(filter, update, new UpdateOptions() { IsUpsert = upsert }, cancellationToken); } /// /// 修改一条数据 /// /// 表名 /// 条件 /// 更新的数据 /// 如果它不存在是否插入文档 /// public async Task UpdateOneAsync(string collection, Expression> filter, UpdateDefinition update, bool upsert, CancellationToken cancellationToken = default) { return await Database.GetCollection(collection).UpdateOneAsync(filter, update, new UpdateOptions() { IsUpsert = upsert }, cancellationToken); } /// /// 修改文档 /// /// 集合名称 /// 修改条件 /// 修改结果 /// 是否插入新文档(filter条件满足就更新,否则插入新文档) /// public long UpdateMany(string collName, Expression> filter, UpdateDefinition update, bool upsert = false) { UpdateResult result = Database.GetCollection(collName).UpdateMany(filter, update, new UpdateOptions { IsUpsert = upsert }); return result.ModifiedCount; } /// /// 修改文档 /// /// 集合名称 /// 修改条件 /// 修改结果 /// 是否插入新文档(filter条件满足就更新,否则插入新文档) /// public long UpdateMany(string collName, Expression> filter, UpdateDefinition update, bool upsert = false) { UpdateResult result = Database.GetCollection(collName).UpdateMany(filter, update, new UpdateOptions { IsUpsert = upsert }); return result.ModifiedCount; } /// /// 修改多个文档 /// /// /// 集合名称 /// 修改条件 /// 修改结果 /// 是否插入新文档(filter条件满足就更新,否则插入新文档) /// public async Task UpdateManyAsync(string collName, Expression> filter, UpdateDefinition update, bool upsert = false, CancellationToken cancellationToken = default) { UpdateResult result = await Database.GetCollection(collName).UpdateManyAsync(filter, update, new UpdateOptions { IsUpsert = upsert }, cancellationToken); return result.ModifiedCount; } /// /// 修改多个文档 /// /// 集合名称 /// 修改条件 /// 修改结果 /// 是否插入新文档(filter条件满足就更新,否则插入新文档) /// public async Task UpdateManyAsync(string collName, Expression> filter, UpdateDefinition update, bool upsert = false, CancellationToken cancellationToken = default) { UpdateResult result = await Database.GetCollection(collName).UpdateManyAsync(filter, update, new UpdateOptions { IsUpsert = upsert }, cancellationToken); return result.ModifiedCount; } /// /// 修改文档 /// /// /// 表名 /// 条件 /// 更新后的数据 /// public T UpdateOne(string collName, Expression> filter, UpdateDefinition update) { T result = Database.GetCollection(collName).FindOneAndUpdate(filter, update); return result; } /// /// 修改文档 /// /// 表名 /// 条件 /// 更新后的Bson数据 /// public BsonDocument UpdateOne(string collName, Expression> filter, UpdateDefinition update) { BsonDocument result = Database.GetCollection(collName).FindOneAndUpdate(filter, update); return result; } /// /// 修改文档 /// /// /// 表名 /// 条件 /// 更新后的数据 /// public Task UpdateOneAsync(string collName, Expression> filter, UpdateDefinition update, CancellationToken cancellationToken = default) { return Database.GetCollection(collName).FindOneAndUpdateAsync(filter, update, cancellationToken: cancellationToken); } /// /// 修改文档 /// /// 表名 /// 条件 /// 更新后的Bson数据 /// public Task UpdateOneAsync(string collName, Expression> filter, UpdateDefinition update, CancellationToken cancellationToken = default) { return Database.GetCollection(collName).FindOneAndUpdateAsync(filter, update, cancellationToken: cancellationToken); } #endregion 更新 #region 删除 /// /// 按BsonDocument条件删除 /// /// 集合名称 /// 文档 /// public long Delete(string collection, BsonDocument document) { DeleteResult result = Database.GetCollection(collection).DeleteOne(document); return result.DeletedCount; } /// /// 按BsonDocument条件删除 /// /// 集合名称 /// 文档 /// public long DeleteMany(string collection, BsonDocument document) { DeleteResult result = Database.GetCollection(collection).DeleteMany(document); return result.DeletedCount; } /// /// 按BsonDocument条件删除 /// /// 集合名称 /// 文档 /// public long Delete(string collection, BsonDocument document) { DeleteResult result = Database.GetCollection(collection).DeleteOne(document); return result.DeletedCount; } /// /// 按BsonDocument条件删除 /// /// 集合名称 /// 文档 /// public long DeleteMany(string collection, BsonDocument document) { DeleteResult result = Database.GetCollection(collection).DeleteMany(document); return result.DeletedCount; } /// /// 按BsonDocument条件删除 /// /// 集合名称 /// 文档 /// public async Task DeleteAsync(string collection, BsonDocument document, CancellationToken cancellationToken = default) { DeleteResult result = await Database.GetCollection(collection).DeleteOneAsync(document, cancellationToken); return result.DeletedCount; } /// /// 按BsonDocument条件删除 /// /// 集合名称 /// 文档 /// public async Task DeleteManyAsync(string collection, BsonDocument document, CancellationToken cancellationToken = default) { DeleteResult result = await Database.GetCollection(collection).DeleteManyAsync(document, cancellationToken); return result.DeletedCount; } /// /// 按BsonDocument条件删除 /// /// 集合名称 /// 文档 /// public async Task DeleteAsync(string collection, BsonDocument document, CancellationToken cancellationToken = default) { DeleteResult result = await Database.GetCollection(collection).DeleteOneAsync(document, cancellationToken); return result.DeletedCount; } /// /// 按BsonDocument条件删除 /// /// 集合名称 /// 文档 /// public async Task DeleteManyAsync(string collection, BsonDocument document, CancellationToken cancellationToken = default) { DeleteResult result = await Database.GetCollection(collection).DeleteManyAsync(document, cancellationToken); return result.DeletedCount; } /// /// 按json字符串删除 /// /// 集合名称 /// json字符串 /// public long Delete(string collName, string json) { var result = Database.GetCollection(collName).DeleteOne(json); return result.DeletedCount; } /// /// 按json字符串删除 /// /// 集合名称 /// json字符串 /// public long DeleteMany(string collName, string json) { var result = Database.GetCollection(collName).DeleteMany(json); return result.DeletedCount; } /// /// 按json字符串删除 /// /// 集合名称 /// json字符串 /// public long Delete(string collName, string json) { var result = Database.GetCollection(collName).DeleteOne(json); return result.DeletedCount; } /// /// 按json字符串删除 /// /// 集合名称 /// json字符串 /// public long DeleteMany(string collName, string json) { var result = Database.GetCollection(collName).DeleteMany(json); return result.DeletedCount; } /// /// 按json字符串删除 /// /// 集合名称 /// json字符串 /// public async Task DeleteAsync(string collName, string json) { var result = await Database.GetCollection(collName).DeleteOneAsync(json); return result.DeletedCount; } /// /// 按json字符串删除 /// /// 集合名称 /// json字符串 /// public async Task DeleteManyAsync(string collName, string json, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteManyAsync(json, cancellationToken); return result.DeletedCount; } /// /// 按json字符串删除 /// /// 集合名称 /// json字符串 /// public async Task DeleteAsync(string collName, string json, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteOneAsync(json, cancellationToken); return result.DeletedCount; } /// /// 按json字符串删除 /// /// 集合名称 /// json字符串 /// public async Task DeleteManyAsync(string collName, string json, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteManyAsync(json, cancellationToken); return result.DeletedCount; } /// /// 按条件表达式删除 /// /// 集合名称 /// 条件表达式 /// public long Delete(string collName, Expression> predicate) { var result = Database.GetCollection(collName).DeleteOne(predicate); return result.DeletedCount; } /// /// 按条件表达式删除 /// /// 集合名称 /// 条件表达式 /// public long DeleteMany(string collName, Expression> predicate) { var result = Database.GetCollection(collName).DeleteMany(predicate); return result.DeletedCount; } /// /// 按条件表达式删除 /// /// 集合名称 /// 条件表达式 /// public long Delete(string collName, Expression> predicate) { var result = Database.GetCollection(collName).DeleteOne(predicate); return result.DeletedCount; } /// /// 按条件表达式删除 /// /// 集合名称 /// 条件表达式 /// public long DeleteMany(string collName, Expression> predicate) { var result = Database.GetCollection(collName).DeleteMany(predicate); return result.DeletedCount; } /// /// 按条件表达式删除 /// /// 集合名称 /// 条件表达式 /// public async Task DeleteAsync(string collName, Expression> predicate, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteOneAsync(predicate, cancellationToken); return result.DeletedCount; } /// /// 按条件表达式删除 /// /// 集合名称 /// 条件表达式 /// public async Task DeleteManyAsync(string collName, Expression> predicate, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteManyAsync(predicate, cancellationToken); return result.DeletedCount; } /// /// 按条件表达式删除 /// /// 集合名称 /// 条件表达式 /// public async Task DeleteAsync(string collName, Expression> predicate, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteOneAsync(predicate, cancellationToken); return result.DeletedCount; } /// /// 按条件表达式删除 /// /// 集合名称 /// 条件表达式 /// public async Task DeleteManyAsync(string collName, Expression> predicate, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteManyAsync(predicate, cancellationToken); return result.DeletedCount; } /// /// 按检索条件删除 /// 建议用Builders<T>构建复杂的查询条件 /// /// 集合名称 /// 条件 /// public long Delete(string collName, FilterDefinition filter) { var result = Database.GetCollection(collName).DeleteOne(filter); return result.DeletedCount; } /// /// 按检索条件删除 /// 建议用Builders<T>构建复杂的查询条件 /// /// 集合名称 /// 条件 /// public long DeleteMany(string collName, FilterDefinition filter) { var result = Database.GetCollection(collName).DeleteMany(filter); return result.DeletedCount; } /// /// 按检索条件删除 /// 建议用Builders<T>构建复杂的查询条件 /// /// 集合名称 /// 条件 /// public long Delete(string collName, FilterDefinition filter) { var result = Database.GetCollection(collName).DeleteOne(filter); return result.DeletedCount; } /// /// 按检索条件删除 /// 建议用Builders<T>构建复杂的查询条件 /// /// 集合名称 /// 条件 /// public long DeleteMany(string collName, FilterDefinition filter) { var result = Database.GetCollection(collName).DeleteMany(filter); return result.DeletedCount; } /// /// 按检索条件删除 /// 建议用Builders<T>构建复杂的查询条件 /// /// 集合名称 /// 条件 /// public async Task DeleteAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteOneAsync(filter, cancellationToken); return result.DeletedCount; } /// /// 按检索条件删除 /// 建议用Builders<T>构建复杂的查询条件 /// /// 集合名称 /// 条件 /// public async Task DeleteManyAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteManyAsync(filter, cancellationToken); return result.DeletedCount; } /// /// 按检索条件删除 /// 建议用Builders<T>构建复杂的查询条件 /// /// 集合名称 /// 条件 /// public async Task DeleteAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteOneAsync(filter, cancellationToken); return result.DeletedCount; } /// /// 按检索条件删除 /// 建议用Builders<T>构建复杂的查询条件 /// /// 集合名称 /// 条件 /// public async Task DeleteManyAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { var result = await Database.GetCollection(collName).DeleteManyAsync(filter, cancellationToken); return result.DeletedCount; } /// /// 删除一条记录 /// /// /// 表名 /// 条件 /// public T DeleteOne(string collName, Expression> filter) { T result = Database.GetCollection(collName).FindOneAndDelete(filter); return result; } /// /// 删除一条记录 /// /// 表名 /// 条件 /// public BsonDocument DeleteOne(string collName, Expression> filter) { BsonDocument result = Database.GetCollection(collName).FindOneAndDelete(filter); return result; } /// /// 删除一条记录 /// /// /// 表名 /// 条件 /// public async Task DeleteOneAsync(string collName, Expression> filter, CancellationToken cancellationToken = default) { T result = await Database.GetCollection(collName).FindOneAndDeleteAsync(filter, cancellationToken: cancellationToken); return result; } /// /// 删除一条记录 /// /// 表名 /// 条件 /// public async Task DeleteOneAsync(string collName, Expression> filter, CancellationToken cancellationToken = default) { BsonDocument result = await Database.GetCollection(collName).FindOneAndDeleteAsync(filter, cancellationToken: cancellationToken); return result; } #endregion 删除 #region 查询 /// /// 查询,复杂查询直接用Linq处理 /// /// 集合名称 /// 要查询的对象 public IQueryable GetQueryable(string collName) { return Database.GetCollection(collName).AsQueryable(); } /// /// 查询,复杂查询直接用Linq处理 /// /// 集合名称 /// 要查询的对象 public IQueryable GetQueryable(string collName) { return Database.GetCollection(collName).AsQueryable(); } /// /// 获取一条数据 /// /// /// 表名 /// 条件 /// public T Get(string collName, FilterDefinition filter) { IFindFluent find = Database.GetCollection(collName).Find(filter); return find.FirstOrDefault(); } /// /// 获取一条数据 /// /// 表名 /// 条件 /// public BsonDocument Get(string collName, FilterDefinition filter) { IFindFluent find = Database.GetCollection(collName).Find(filter); return find.FirstOrDefault(); } /// /// 获取一条数据 /// /// /// 表名 /// 条件 /// public async Task GetAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { IAsyncCursor find = await Database.GetCollection(collName).FindAsync(filter, cancellationToken: cancellationToken); return await find.FirstOrDefaultAsync(cancellationToken: cancellationToken); } /// /// 获取一条数据 /// /// 表名 /// 条件 /// public async Task GetAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { IAsyncCursor find = await Database.GetCollection(collName).FindAsync(filter, cancellationToken: cancellationToken); return await find.FirstOrDefaultAsync(cancellationToken: cancellationToken); } /// /// 获取多条数据 /// /// /// 表名 /// 条件 /// public IEnumerable GetMany(string collName, FilterDefinition filter) { IFindFluent find = Database.GetCollection(collName).Find(filter); return find.ToEnumerable(); } /// /// 获取多条数据 /// /// 表名 /// 条件 /// public IEnumerable GetMany(string collName, FilterDefinition filter) { IFindFluent find = Database.GetCollection(collName).Find(filter); return find.ToEnumerable(); } /// /// 获取多条数据 /// /// /// 表名 /// 条件 /// public async Task> GetManyAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { IAsyncCursor find = await Database.GetCollection(collName).FindAsync(filter, cancellationToken: cancellationToken); return find.ToEnumerable(); } /// /// 获取多条数据 /// /// 表名 /// 条件 /// public async Task> GetManyAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { IAsyncCursor find = await Database.GetCollection(collName).FindAsync(filter, cancellationToken: cancellationToken); return find.ToEnumerable(); } /// /// 判断是否存在符合条件的数据 /// /// /// 表名 /// 条件 /// public bool Any(string collName, FilterDefinition filter) { IFindFluent find = Database.GetCollection(collName).Find(filter); return find.Any(); } /// /// 判断是否存在符合条件的数据 /// /// 表名 /// 条件 /// public bool Any(string collName, FilterDefinition filter) { IFindFluent find = Database.GetCollection(collName).Find(filter); return find.Any(); } /// /// 判断是否存在符合条件的数据 /// /// 表名 /// 条件 /// public async Task AnyAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { IAsyncCursor find = await Database.GetCollection(collName).FindAsync(filter, cancellationToken: cancellationToken); return await find.AnyAsync(cancellationToken: cancellationToken); } /// /// 判断是否存在符合条件的数据 /// /// 表名 /// 条件 /// public async Task AnyAsync(string collName, FilterDefinition filter, CancellationToken cancellationToken = default) { IAsyncCursor find = await Database.GetCollection(collName).FindAsync(filter, cancellationToken: cancellationToken); return await find.AnyAsync(cancellationToken: cancellationToken); } #endregion 查询 #region 索引 /// /// 创建索引 /// /// 集合名 /// 索引键 /// /// public string CreateIndex(string collection, string index, bool asc = true) { IMongoIndexManager mgr = Database.GetCollection(collection).Indexes; var list = mgr.List(); while (list.MoveNext()) { if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index))) { return mgr.CreateOne(new CreateIndexModel(asc ? Builders.IndexKeys.Ascending(doc => doc[index]) : Builders.IndexKeys.Descending(doc => doc[index]))); } } return string.Empty; } /// /// 创建索引 /// /// 集合名 /// 索引键 /// /// public async Task CreateIndexAsync(string collection, string index, bool asc = true, CancellationToken cancellationToken = default) { IMongoIndexManager mgr = Database.GetCollection(collection).Indexes; var list = await mgr.ListAsync(cancellationToken); while (await list.MoveNextAsync(cancellationToken)) { if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index))) { return await mgr.CreateOneAsync(new CreateIndexModel(asc ? Builders.IndexKeys.Ascending(doc => doc[index]) : Builders.IndexKeys.Descending(doc => doc[index])), cancellationToken: cancellationToken); } } return string.Empty; } /// /// 更新索引 /// /// 集合名 /// 索引键 /// /// public string UpdateIndex(string collection, string index, bool asc = true) { IMongoIndexManager mgr = Database.GetCollection(collection).Indexes; return mgr.CreateOne(new CreateIndexModel(asc ? Builders.IndexKeys.Ascending(doc => doc[index]) : Builders.IndexKeys.Descending(doc => doc[index]))); } /// /// 更新索引 /// /// 集合名 /// 索引键 /// /// public async Task UpdateIndexAsync(string collection, string index, bool asc = true, CancellationToken cancellationToken = default) { IMongoIndexManager mgr = Database.GetCollection(collection).Indexes; return await mgr.CreateOneAsync(new CreateIndexModel(asc ? Builders.IndexKeys.Ascending(doc => doc[index]) : Builders.IndexKeys.Descending(doc => doc[index])), cancellationToken: cancellationToken); } /// /// 删除索引 /// /// 集合名 /// 索引键 /// public void DropIndex(string collection, string index) { Database.GetCollection(collection).Indexes.DropOne(index); } /// /// 删除索引 /// /// 集合名 /// 索引键 /// public Task DropIndexAsync(string collection, string index, CancellationToken cancellationToken = default) { return Database.GetCollection(collection).Indexes.DropOneAsync(index, cancellationToken); } /// /// 创建索引 /// /// 集合名 /// 索引键 /// /// /// public string CreateIndex(string collection, string index, Expression> key, bool asc = true) { IMongoIndexManager mgr = Database.GetCollection(collection).Indexes; var list = mgr.List(); while (list.MoveNext()) { if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index))) { return mgr.CreateOne(new CreateIndexModel(asc ? Builders.IndexKeys.Ascending(key) : Builders.IndexKeys.Descending(key))); } } return String.Empty; } /// /// 创建索引 /// /// 集合名 /// 索引键 /// /// /// public async Task CreateIndexAsync(string collection, string index, Expression> key, bool asc = true, CancellationToken cancellationToken = default) { IMongoIndexManager mgr = Database.GetCollection(collection).Indexes; var list = await mgr.ListAsync(cancellationToken); while (await list.MoveNextAsync(cancellationToken)) { if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index))) { return await mgr.CreateOneAsync(new CreateIndexModel(asc ? Builders.IndexKeys.Ascending(key) : Builders.IndexKeys.Descending(key)), cancellationToken: cancellationToken); } } return String.Empty; } /// /// 更新索引 /// /// 集合名 /// /// /// public string UpdateIndex(string collection, Expression> key, bool asc = true) { IMongoIndexManager mgr = Database.GetCollection(collection).Indexes; return mgr.CreateOne(new CreateIndexModel(asc ? Builders.IndexKeys.Ascending(key) : Builders.IndexKeys.Descending(key))); } /// /// 更新索引 /// /// 集合名 /// /// /// public async Task UpdateIndexAsync(string collection, Expression> key, bool asc = true, CancellationToken cancellationToken = default) { IMongoIndexManager mgr = Database.GetCollection(collection).Indexes; return await mgr.CreateOneAsync(new CreateIndexModel(asc ? Builders.IndexKeys.Ascending(key) : Builders.IndexKeys.Descending(key)), cancellationToken: cancellationToken); } #endregion 索引 } }