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

Posted

技术标签:

【中文标题】如何通过 .NET 在 MongoDB 中创建索引【英文标题】:How to create indexes in MongoDB via .NET 【发布时间】:2013-07-22 08:50:51 【问题描述】:

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

此时我想以编程方式创建和构建索引。我该怎么做?

【问题讨论】:

Creating MongoDB Unique Key with C# 的可能重复项 【参考方案1】:

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

目前推荐的创建索引的方法是调用并等待CreateOneAsyncIndexKeysDefinition,您使用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));

【讨论】:

花生画廊的快速问题 我是 C# 中强类型 lambda 的忠实粉丝,但问题变成假设仓鼠对象有一个地址数组(账单、物理、邮寄、等),我也想按邮政编码索引。不幸的是,一旦您点击 Builders.IndexKeys.Ascending(_ => _.Addresses.First().ZipCode) ,索引就会创建,就好像邮政编码在根类仓鼠上一样。 docs.mongodb.com 上的文档充其量是稀疏的。 所以你应该只在应用程序启动时创建一次索引? @DavideQuaglio 这就是我通常做的事情。只做一次就足够了,但这保证了幂等性。 请同时查看***.com/questions/51248295/…【参考方案2】:

您应该使用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));

【讨论】:

@PhilBarresi 你的意思是放弃现有的并建立一个新的吗?或者干脆建立另一个索引?两者都不会发生。 显然我错了;它发送建立索引的命令,但如果索引已经建立,它将导致无操作;我的误解来自于前台索引创建错误导致其他 createindex 调用被阻塞,导致我相信他们正在重建索引。抱歉,I3arnon 就在这里。 CreateIndex 在我的代码中似乎被标记为过时,而 EnsureIndex 没有。这个信息绝对正确吗?在我看来,他们不太可能在版本更新中切换哪些已过时(所以我不敢相信我们正在查看不同版本的代码)。 @Chris 我不知道您使用的是什么版本,但在最新的稳定版本中,EnsureIndex 已过时。在source code on github的当前版本中也是如此 @I3arnon:我似乎使用的是旧版本,来自 nuget 的 1.8.3。仍然很奇怪,他们从 createIndex 在我拥有的版本中已经过时,并推荐 EnsureIndex 到相反的方向。感谢您花时间检查,并确实将我指向 github 源。非常有用。【参考方案3】:

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

【讨论】:

【参考方案4】:

应该这样做:

var server = MongoServer.Create("mongodb://localhost");
var db = server.GetDatabase("myapp");

var users = db.GetCollection<User>("users");

users.EnsureIndex(new IndexKeysBuilder().Ascending("EmailAddress"));

请参阅文档中的以下位:

http://api.mongodb.org/csharp/current/html/06bcd201-8844-3df5-d170-15f2b423675c.htm

【讨论】:

已过时,请参阅 I3arnon 答案【参考方案5】:

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

【讨论】:

引用较旧的驱动程序版本毫无价值。从那以后它发生了变化。在撰写本文时 2.13 是最新的:mongodb.github.io/mongo-csharp-driver/2.13/reference/driver/…【参考方案6】:

在 C# 中创建索引的最简单方法是使用驱动程序包装库 MongoDB.Entities。这是创建文本索引的示例:

    DB.Index<Author>()
      .Key(a => a.Name, Type.Text)
      .Key(a => a.Surname, Type.Text)
      .Create();

要进行全文搜索,您只需:

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

没有见过比这更简单的东西。

【讨论】:

以上是关于如何通过 .NET 在 MongoDB 中创建索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在嵌套的 MongoDB 集合中创建索引?

如何使用 C++ 在 MongoDB 中创建地理空间索引

如何在 Robo 3T(原 Robomongo)中创建 Mongodb 索引?

如何使用 golang 和 mgo 库在 mongodb 中创建文本索引?

如何在 Nestjs 中创建 mongodb 连接提供程序

一日一技:MongoDB如何正确中断正在创建的索引