首先,向字段'items.barcode'
添加唯一索引。
db.clothes.createIndex({'items.barcode': 1}, {unique: 1});
然后,将一些文档插入clothes
表。
db.clothes1.remove({});
db.clothes.insert([
{ // success
_id: '1',
items: [
{barcode: ['122', '122']},
{barcode: ['122', '124']}
]
},
{ // success
_id: '2',
items: [
{barcode: ['222', '223']},
{barcode: ['224', '225']}
]
},
{ // failed
_id: '3',
items: [
{barcode: ['122', '323']},
{barcode: ['324', '325']}
]
}
]);
现在我们可以看到第3个文件插入失败,导致错误:
' E11000重复键错误索引:duolayimeng.clothes1。$ items.barcode_1 dup key:{:" 122" }'
但是在第一个文档的两个嵌入文档中,'barcode'
字段有3个元素是'122'
。
我对这种情况感到困惑。 MongoDB如何决定嵌入文档中的数组类型字段(如'items.barcode'
)是否唯一?
答案 0 :(得分:0)
这是因为,索引在集合文档中是唯一的。
子文档不是真正的文档,文档被强制拥有唯一的字段,子文档不能强制在文档中唯一。
ID为3的文档失败,因为已存在具有相同唯一键的其他文档。
ID为1的文档正在插入OK,因为没有其他文档具有相同的唯一字段。
如果要在文档中实现唯一性,则必须在客户端实现该功能或修改模式,并使用$addToSet
在集合中添加值答案 1 :(得分:0)