地理空间索引:便于地理查询
// 堆代码 duidaima.com // 创建索引 db.collection.createIndex(keys, options); // 查询索引 db.collection.getIndexes(filter); // 删除索引 db.collection.dropIndex("IndexName"); // 删除所有索引 db.collection.dropIndexes() // explain 查看查询是否走索引 // "stage" : "COLLSCAN", 表示全集合扫描 // "stage" : "IXSCAN" ,基于索引的扫描 db.collection.find(query,options).explain(options)
[Table("MyTasks")] public class MyTaskEntity : IEntity { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; } public string OrderNumber { get; set; } public List<TransmissionEntity> Transmissions { get; set; } public DispatchTaskEntity() { this.Transmissions = new List<TransmissionEntity>(); } public DispatchTaskEntity(string orderNumber) { this.OrderNumber = orderNumber; this.Transmissions = new List<TransmissionEntity>(); } ...... }下面,我们将使用基于上面提到的那篇文章中的 EDT.MongoProxy组件中 的内容 MongoDbConection,这是一个包裹MongoClient的单例对象:
public class MongoDbConnection : IMongoDbConnection { public IMongoClient DatabaseClient { get; } public string DatabaseName { get; } public MongoDbConnection(MongoDatabaseConfigs configs, IConfiguration configuration) { DatabaseClient = new MongoClient(configs.GetMongoClientSettings(configuration)); DatabaseName = configs.DatabaseName; } }
public static class AppDbContext { /// <summary> /// Create indexes in MongoDB when startup /// NOTE: It'll skip creation when the indexes already exists. /// </summary> public static void Initialize(IApplicationBuilder app) { var dbInstance = app.ApplicationServices.GetService<IMongoDbConnection>(); var logger = app.ApplicationServices.GetService<ILogger<MongoRepository>>(); var db = dbInstance.DatabaseClient.GetDatabase(dbInstance.DatabaseName); var collection = db.GetCollection("MyTasks"); // Index definitions var indexKeysDefine = Builders<MyTaskEntity>.IndexKeys.Ascending(indexKey => indexKey.OrderNumber); // Create indexes by RunCommand try { await collection.Indexes.CreateOneAsync(new CreateIndexModel(indexKeysDefine)); } catch (Exception ex) { logger.LogError(ex, "{service}.{method} - throws an exception when creating indexes in database", nameof(AppDbContext), nameof(Initialize)); } } }使用Builders.IndexKeys可以方便快速的声明索引,并且它只会在对应索引不存在的时候创建,已存在时则会跳过。但是如果你想要给集合字段的某个字段声明索引,则不太容易实现。这个时候,你可以考虑方式二。
public static class AppDbContext { /// <summary> /// Create indexes in MongoDB when startup /// NOTE: It'll skip creation when the indexes already exists. /// </summary> public static void Initialize(IApplicationBuilder app) { var dbInstance = app.ApplicationServices.GetService<IMongoDbConnection>(); var logger = app.ApplicationServices.GetService<ILogger<MongoRepository>>(); var db = dbInstance.DatabaseClient.GetDatabase(dbInstance.DatabaseName); // Index definitions var indexCommand1 = @"{ createIndexes: 'MyTasks', indexes: [ { key: { 'OrderNumber': 1 }, name:'Idx_OrderNumber', unique: true } ] }"; var indexCommand2 = @"{ createIndexes: 'MyTasks', indexes: [ { key: { 'Transmissions.Type': 1, 'Transmissions.Status':1, 'Transmissions.Retries':1 }, name:'Idx_Transmission_TypeStatusRetries', unique: false } ] }"; // Create indexes by RunCommand try { db.RunCommand<BsonDocument>(BsonDocument.Parse(indexCommand1)); db.RunCommand<BsonDocument>(BsonDocument.Parse(indexCommand2)); } catch (Exception ex) { logger.LogError(ex, "{service}.{method} - throws an exception when creating indexes in database", nameof(AppDbContext), nameof(Initialize)); } } }在Program.cs中使用
...... AppDbContext.Initialize(app); ......小结