数组字段上的唯一复合索引
Unique compound index on array fields
我正在尝试创建 mongo 具有复合索引的文档。我的示例文档如下所示
{
fname: "fname1",
lname : "lname1",
task : ["t11", "t12", "t13"]
}
{
fname: "fname2",
lname : "lname2",
task : ["t21", "t22", "t23"]
}
{
fname: "fname3",
lname : "lname3",
task : ["t31", "t32", "t33"]
}
索引如下
createIndex({ fname: 1, lname: 1, task: 1 }, { unique: true, name: 'some-index-name'})
我期待的是
如有变化
- fname 或
- lname OR
- 任务(任何部分数据更改 - 至少一个元素)
应被视为唯一文档。
我遇到了这个异常
"E11000 重复键错误集合"
我查看了休闲 links.But 没弄清楚。
https://docs.mongodb.com/manual/core/index-partial/
您说得对,唯一索引的限制正如您所描述的那样。但是,这仅适用于 奇异值 字段。在数组上使用唯一索引后,它就成为唯一+多键索引。
基本上,当您在数组字段上创建索引时,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 }
这就是为什么不能在一个索引中索引多个数组字段的原因。如果您有多个数组,索引条目的数量将是两个数组长度的乘积。您的索引很容易就会比您的数据大,扫描如此大的索引可能需要相当长的时间。
我正在尝试创建 mongo 具有复合索引的文档。我的示例文档如下所示
{ fname: "fname1", lname : "lname1", task : ["t11", "t12", "t13"] }
{ fname: "fname2", lname : "lname2", task : ["t21", "t22", "t23"] }
{ fname: "fname3", lname : "lname3", task : ["t31", "t32", "t33"] }
索引如下
createIndex({ fname: 1, lname: 1, task: 1 }, { unique: true, name: 'some-index-name'})
我期待的是
如有变化
- fname 或
- lname OR
- 任务(任何部分数据更改 - 至少一个元素)
应被视为唯一文档。
我遇到了这个异常 "E11000 重复键错误集合"
我查看了休闲 links.But 没弄清楚。
https://docs.mongodb.com/manual/core/index-partial/
您说得对,唯一索引的限制正如您所描述的那样。但是,这仅适用于 奇异值 字段。在数组上使用唯一索引后,它就成为唯一+多键索引。
基本上,当您在数组字段上创建索引时,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 }
这就是为什么不能在一个索引中索引多个数组字段的原因。如果您有多个数组,索引条目的数量将是两个数组长度的乘积。您的索引很容易就会比您的数据大,扫描如此大的索引可能需要相当长的时间。