【发布时间】:2013-07-22 08:50:51
【问题描述】:
我已经使用 MongoDB C# 驱动程序以编程方式创建了一个新的文档集合。
此时我想以编程方式创建和构建索引。我该怎么做?
【问题讨论】:
标签: c# .net mongodb indexing mongodb-.net-driver
我已经使用 MongoDB C# 驱动程序以编程方式创建了一个新的文档集合。
此时我想以编程方式创建和构建索引。我该怎么做?
【问题讨论】:
标签: c# .net mongodb indexing mongodb-.net-driver
从驱动程序的 v2.0 开始,有一个新的 async-only API。不应再使用旧 API,因为它是新 API 的阻塞外观,已被弃用。
目前推荐的创建索引的方法是调用并等待CreateOneAsync 和IndexKeysDefinition,您使用Builders.IndexKeys 获得:
static async Task CreateIndexAsync()
{
var client = new MongoClient();
var database = client.GetDatabase("HamsterSchool");
var collection = database.GetCollection<Hamster>("Hamsters");
var indexKeysDefinition = Builders<Hamster>.IndexKeys.Ascending(hamster => hamster.Name);
await collection.Indexes.CreateOneAsync(new CreateIndexModel<Hamster>(indexKeysDefinition));
}
【讨论】:
您应该使用CreateIndex,因为EnsureIndex 已被标记为过时,以便将来与MongoDB 的下一版本兼容:
var client = new MongoClient("mongodb://localhost");
var db = client.GetServer().GetDatabase("db");
var collection = db.GetCollection<Hamster>("Hamsters");
collection.CreateIndex(IndexKeys<Hamster>.Ascending(_ => _.Name));
【讨论】:
EnsureIndex 已过时。在source code on github的当前版本中也是如此
当前接受的答案中CreateOneAsync 的重载现在被标记为已过时,并显示消息“改为使用带有 CreateIndexModel 的 CreateOneAsync”。以下是你的做法:
static async Task CreateIndex(string connectionString)
{
var client = new MongoClient(connectionString);
var database = client.GetDatabase("HamsterSchool");
var collection = database.GetCollection<Hamster>("Hamsters");
var indexOptions = new CreateIndexOptions();
var indexKeys = Builders<Hamster>.IndexKeys.Ascending(hamster => hamster.Name);
var indexModel = new CreateIndexModel<Hamster>(indexKeys, indexOptions);
await collection.Indexes.CreateOneAsync(indexModel);
}
【讨论】:
应该这样做:
var server = MongoServer.Create("mongodb://localhost");
var db = server.GetDatabase("myapp");
var users = db.GetCollection<User>("users");
users.EnsureIndex(new IndexKeysBuilder().Ascending("EmailAddress"));
请参阅文档中的以下位:
【讨论】:
Definitions and Builders 文档页面下有一个完整的索引区域:
http://mongodb.github.io/mongo-csharp-driver/2.4/reference/driver/definitions/#index-keys
例子:
IndexKeysDefinition<MyModel> keys = "{ Reference: 1 }";
var indexModel = new CreateIndexModel<MyModel>(keys);
await _context.Indexes.CreateOneAsync(indexModel);
【讨论】:
在 C# 中创建索引的最简单方法是使用驱动程序包装库 MongoDB.Entities。这是创建文本索引的示例:
DB.Index<Author>()
.Key(a => a.Name, Type.Text)
.Key(a => a.Surname, Type.Text)
.Create();
要进行全文搜索,您只需:
DB.SearchText<Author>("search term");
没有见过比这更简单的东西。
【讨论】: