数组字段上的唯一复合索引



我正在尝试创建带有复合索引的mongo文档。我的示例文档如下所示

{ fname: "fname1", lname : "lname1", 任务 : ["T11", "T12", "T13"] }

{ fname: "fname2", lname : "lname2", 任务 : ["T21", "T22", "T23"] }

{ fname: "fname3", lname : "lname3", 任务 : ["T31", "T32", "T33"] }

索引如下

createIndex({ fname: 1, lname: 1, task: 1 }, { unique: true, name: 'some-index-name'})

我期待的是

如果有任何变化

  • fname
  • lname
  • 任务(任何部分数据更改 - 至少一个元素)

应被视为唯一文件。

我收到此异常 ">E11000 重复密钥错误收集">

我查看了休耕链接。但想不通。

部分索引有哪些限制?

https://docs.mongodb.com/manual/core/index-partial/

https://docs.mongodb.com/manual/indexes/#create-an-index

蒙戈代码库: https://github.com/mongodb/mongo/blob/69dec2fe8fed6d32ec4998ea7ec7ab063cb5b788/src/mongo/db/catalog/index_catalog.cpp#L422

您是正确的,唯一索引的限制如您所描述的。但是,这仅适用于奇异值字段。一旦在数组上使用唯一索引,它就会成为唯一+多键索引。

基本上,当您在数组字段上创建索引时,MongoDB会为该文档中的每个数组字段创建一个索引条目。这称为多键索引。

例如,文档:

{a:1, b:[1, 2, 3]}

使用索引:

db.test.createIndex({a:1, b:1})

对于b的每个数组元素,索引中将有三个条目:

{a:1, b:1}
{a:1, b:2}
{a:1, b:3}

因此,如果在字段a上创建唯一索引并b

db.test.createIndex({a:1, b:1}, {unique:true})

所有这些插入都将因唯一索引冲突而失败:

> db.test.insert({a:1, b:1})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 1.0 }
> db.test.insert({a:1, b:2})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 2.0 }
> db.test.insert({a:1, b:3})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 3.0 }
> db.test.insert({a:1, b:[1]})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 1.0 }
> db.test.insert({a:1, b:[1,2]})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 1.0 }
> db.test.insert({a:1, b:[1,2,3]})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 1.0 }

这就是不能在一个索引中索引多个数组字段的原因。如果您有多个数组,则索引条目的数量将是两个数组长度的乘数。您的索引很容易大于您的数据,扫描如此大的索引可能需要相当长的时间。

相关内容

  • 没有找到相关文章

最新更新