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

Pay*_*unt 40 .net c# indexing mongodb mongodb-.net-driver

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

此时我想以编程方式创建和构建索引.我怎样才能做到这一点?

i3a*_*non 62

从驱动程序的v2.0开始,有一个新的async-inly API.不应再使用旧的API,因为它是新API的阻止外观,不推荐使用.

目前推荐的方法来创建一个索引是通过调用并等待CreateOneAsyncIndexKeysDefinition您通过使用得到Builders.IndexKeys:

static async Task CreateIndex()
{
    var client = new MongoClient();
    var database = client.GetDatabase("HamsterSchool");
    var collection = database.GetCollection<Hamster>("Hamsters");
    await collection.Indexes.CreateOneAsync(Builders<Hamster>.IndexKeys.Ascending(_ => _.Name));
}
Run Code Online (Sandbox Code Playgroud)

  • 关于花生画廊的快速问题我很喜欢C#中的强类型lambdas而不是其他地方的魔术字符串,但问题是假设Hamster对象有一组地址(计费,物理,邮件等),我也想索引通过邮政编码.不幸的是,一旦你点击了Builders <Hamster> .IndexKeys.Ascending(_ => _.Addresses.First(..ZipCode),索引会创建好像邮政编码在根类仓鼠上.docs.mongodb.com上的文档充其量只是稀疏的. (2认同)

i3a*_*non 44

你应该使用CreateIndexEnsureIndex是过时的标记与下一个版本未来的兼容性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));
Run Code Online (Sandbox Code Playgroud)

  • 显然我错了; 它发送命令来构建索引,但如果索引已经构建,则会产生no-op; 我的误解来自于前景索引创建错误导致其他createindex调用被阻止,导致我相信他们正在重建索引.抱歉,I3arnon就在这里. (9认同)

Der*_*ick 15

这样的事情应该做:

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

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

users.EnsureIndex(new IndexKeysBuilder().Ascending("EmailAddress"));
Run Code Online (Sandbox Code Playgroud)

请参阅文档中的以下位:

  • 已过时,请参阅I3arnon的回答 (10认同)

Ste*_*edy 9

CreateOneAsync现在,消息“将CreateOneAsync与CreateIndexModel代替使用”将当前接受的答案中的重载标记为过时的。这是您的操作方式:

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);
}
Run Code Online (Sandbox Code Playgroud)


Cra*_*aig 5

在定义和构建器文档页面下有一个关于索引的完整区域:

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);
Run Code Online (Sandbox Code Playgroud)

  • 这引用了较旧的驱动程序版本,毫无价值。从那以后情况发生了变化。在撰写本文时,2.13 是最新的:http://mongodb.github.io/mongo-csharp-driver/2.13/reference/driver/definitions/#index-keys (2认同)