我正在尝试使用复合索引创建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'})
我期待的是
如果有任何改变
应被视为唯一文件。
我得到了这个例外 “ E11000重复密钥错误集合”
我查看了不感兴趣的链接。但是无法弄明白。
What are the limitations of partial indexes?
https://docs.mongodb.com/manual/core/index-partial/
答案 0 :(得分:3)
您是正确的,唯一索引的限制如您所述。但是,这仅适用于奇异值字段。一旦在数组上使用唯一索引,就会使它成为唯一的+多键索引。
基本上,当您在数组字段上创建索引时,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 }
这就是为什么你不能索引索引中的多个数组字段的原因。如果您有多个数组,索引条目的数量将是两个数组长度的倍数。您的索引可能很容易大于您的数据,扫描这么大的索引可能需要相当长的时间。