在 C# 中创建复合索引

Posted

技术标签:

【中文标题】在 C# 中创建复合索引【英文标题】:creating a compound index in c# 【发布时间】:2013-02-01 00:29:06 【问题描述】:

我想创建一个复合索引,其中一个键应按升序排列,第二个键应按降序排列。

我该怎么做?

我有一个包含用户选择的属性名称的字符串。

collection.EnsureIndex(IndexKeys.Descending(selectedProperties[0]),
                IndexKeys.Ascending(selectedProperties[1])),
IndexOptions.......

没用

【问题讨论】:

【参考方案1】:

在驱动程序的 v2.x 中,他们完全更改了 API,因此目前异步创建复合索引的方法(首选)是:

await collection.Indexes.CreateOneAsync(
    Builders<Hamster>.IndexKeys.Ascending(_ => _.Name).Descending(_ => _.Age),
    new CreateIndexOptions  Background = true );

并同步:

collection.Indexes.CreateOne(
    Builders<Hamster>.IndexKeys.Ascending(_ => _.Name).Descending(_ => _.Age),
    new CreateIndexOptions  Sparse = true );

【讨论】:

v2.3如何创建多个索引(Indexes.CreateMany())? 这里的“Background=true”选项到底有什么作用?【参考方案2】:

这是一种方法:

var keys = new IndexKeysBuilder();

keys.Ascending(keyName1);
keys.Descending(keyName2);

var options = new IndexOptionsBuilder();
options.SetSparse(true);
options.SetUnique(false);
collection.EnsureIndex(keys, options);

【讨论】:

【参考方案3】:

EnsureIndex 现已过时,因此应改用 CreateIndex。还有支持流畅使用的静态构建器类:IndexKeysIndexOptions

所以最干净的选择是:

collection.CreateIndex(
    IndexKeys.Ascending(keyName1).Descending(keyName2),
    IndexOptions.SetSparse(true).SetUnique(false));

对于通用类型安全选项:

collection.CreateIndex(
    IndexKeys<Document>.Ascending(d => d.Property1).Descending(d => d.Property2),
    IndexOptions.SetSparse(true).SetUnique(false));

【讨论】:

【参考方案4】:

创建索引
var indexModel = new CreateIndexModel<T>(keys.Ascending(x => x.Property1).Ascending(x=>x.Property2));
                
collection.Indexes.CreateOne(indexModel);

【讨论】:

感谢您的回答,aadreja。您能否添加一些文字来解释为什么这是最佳答案,或者它是如何工作的? @SashaKondrashov - 带有索引键的 collection.CreateIndex 已过时 (mongodb.github.io/mongo-csharp-driver/2.9/apidocs/html/…)。

以上是关于在 C# 中创建复合索引的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB + C#:未选择/使用 GUID 字段上的复合索引

SQL Server创建复合索引时,复合索引列顺序对查询的性能影响

SQL Server创建复合索引时,复合索引列顺序对查询的性能影响

SQL Server创建复合索引时,复合索引列顺序对查询的性能影响

SQL Server创建复合索引时,复合索引列顺序对查询的性能影响

C#笔记