在MongoDB的嵌入文档中为数组类型字段添加唯一索引

时间:2016-07-04 10:01:38

标签: mongodb indexing

首先,向字段'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')是否唯一?

2 个答案:

答案 0 :(得分:0)

这是因为,索引在集合文档中是唯一的。

子文档不是真正的文档,文档被强制拥有唯一的字段,子文档不能强制在文档中唯一。

ID为3的文档失败,因为已存在具有相同唯一键的其他文档。

ID为1的文档正在插入OK,因为没有其他文档具有相同的唯一字段。

如果要在文档中实现唯一性,则必须在客户端实现该功能或修改模式,并使用$addToSet

在集合中添加值

答案 1 :(得分:0)

  

唯一索引允许插入以下文档   如果集合中没有其他文档具有a.b,则为集合   值5:

db.collection.insert( { a: [ { b: 5 }, { b: 5 } ] } )

以下是doc