多个复合键

Mur*_*nze 2 mongodb mongodb-.net-driver

这是我的实体:

{
     name: "",
     list: [{
       a: 1,
       b: 1   
     }]
}
Run Code Online (Sandbox Code Playgroud)

我想创建两个索引,一个按名称创建,另一个为 a 和 b 一起创建。

示例:尝试插入 a=1 和 b=1 两次一定会抛出错误。

我的mongodb驱动是2.

为了名字,我是这样工作的:

    await collection.Indexes.CreateOneAsync(Builders<MyEntity>.IndexKeys.Ascending(m => m.Name), new CreateIndexOptions()
    {
        Unique = true,
        Sparse = true
    });
Run Code Online (Sandbox Code Playgroud)

如何为列表中的两个属性执行此操作?

mne*_*syn 5

从 C# 端,您可以使用IndexKeys.Combine帮助器来创建这样的索引:

await coll.Indexes.CreateOneAsync(Builders<MyEntity>.IndexKeys.Combine(
       Builders<MyEntity>.IndexKeys.Ascending("list.a"), 
       Builders<MyEntity>.IndexKeys.Ascending("list.b")), new CreateIndexOptions()
        {
            Unique = true,
            Sparse = true
        });
Run Code Online (Sandbox Code Playgroud)

一个奇怪的行为是,约束不是在单个文档SERVER-1068)内强制执行的,因为索引不被视为“在”文档内,可以这么说。换句话说,您始终可以插入文档list : [ {a:1, b:1}, {a:1, b:1} ],即具有包含副本的列表的文档。这在应用程序端很容易修复,但了解一下可能会更好。