如何通过.NET在MongoDB中创建索引

64

我已使用MongoDB C#驱动程序编程创建了一个新的文档集合。

现在我想以编程方式创建和构建索引。我该如何做到这一点?


可能是使用C#创建MongoDB唯一键的重复问题。 - WiredPrairie
6个回答

83

从驱动程序的v2.0开始,有一个新的async API。旧的API不应再使用,因为它是对新API的阻塞外观,并已弃用。

目前推荐的创建索引的方法是通过调用并等待使用Builders.IndexKeys获得的IndexKeysDefinitionCreateOneAsync

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

2
快速问题,我是强类型lambda在C#中的粉丝,而不是其他地方的魔术字符串。但问题是,假设Hamster对象有一个地址数组(账单、物理、邮寄等),我还想按邮政编码索引。不幸的是,一旦你到达Builders<Hamster>.IndexKeys.Ascending(_ => _.Addresses.First().ZipCode),索引就会创建,好像邮政编码在根类hamster上一样。docs.mongodb.com上的文档非常稀少。 - Buvy
那么你应该在应用程序启动时只创建索引一次? - Davide Quaglio
@DavideQuaglio 这通常是我做的。只需要执行一次就足够了,但这可以保证幂等性。 - i3arnon
请查看 https://dev59.com/9FUK5IYBdhLWcg3w0Cm9。 - bonzaster

46

在未来版本的 MongoDB 中,EnsureIndex 标记为过时,建议您使用 CreateIndex 以确保向后兼容性:

var client = new MongoClient("mongodb://localhost");
var db = client.GetServer().GetDatabase("db");
var collection = db.GetCollection<Hamster>("Hamsters");

collection.CreateIndex(IndexKeys<Hamster>.Ascending(_ => _.Name));

1
@PhilBarresi 你的意思是放弃现有的并建立一个新的吗?还是只是建立另一个索引? 两者都不会发生。 - i3arnon
10
看起来我错了;它发送构建索引的命令,但如果索引已经建立,则会导致无操作;我的误解来自于前景索引创建出现错误,导致其他创建索引调用被阻塞,使我误以为它们正在重建索引。对不起,大家,I3arnon 在这里是正确的。 - Phil Barresi
1
@Chris,我不知道你使用的是哪个版本,但在最新的稳定版本中,EnsureIndex已经过时了。在GitHub上的源代码的当前版本中也是如此。 - i3arnon
1
@I3arnon:我使用的是旧版本,来自NuGet的1.8.3。仍然觉得奇怪,他们从我使用的版本中将createIndex标记为过时,建议使用EnsureIndex,现在又反过来了。感谢你抽出时间进行检查,并确实指向了GitHub源代码。非常有用。 - Chris
我正在使用v2.2.4版本的collectionName.Indexes.CreateOne(Builders<TDocument>.IndexKeys.Ascending(doc => doc.Field)); - Marcello
显示剩余2条评论

41

目前被接受的答案中的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);
}

15

10
已过时,请参考I3arnon的回答。 - Northstrider

5

2
值得注意的是,这个引用是针对旧的驱动程序版本的。它已经发生了改变。在撰写本文时,2.13是最新版本:http://mongodb.github.io/mongo-csharp-driver/2.13/reference/driver/definitions/#index-keys - Jack

4
使用驱动包装库MongoDB.Entities是在C#中创建索引的最简单方法。这里是创建文本索引的示例:
    DB.Index<Author>()
      .Key(a => a.Name, Type.Text)
      .Key(a => a.Surname, Type.Text)
      .Create();

要进行全文搜索,只需执行以下操作:

    DB.SearchText<Author>("search term");

我还没有看到比这更简单的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接