【发布时间】:2016-07-13 09:44:42
【问题描述】:
我对 NoSQL 数据库完全陌生,目前正在使用 MongoDB。
我试图理解为什么默认的_id 索引在upserting a duplicate _id 文档时不会引发错误。
如文档中所述,_id 默认是唯一索引
(虽然这里没有显示唯一标志..)
> db.foo.getIndexes();
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.foo"
}
]
>
所以当upserting 文档(以空集合开头)时,
如果首先插入它然后似乎“忽略”它。
> db.foo.update({ _id: 'doe123'}, { _id: 'doe123', name: 'John Doe'}, { upsert: true});
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "doe123" })
> db.foo.update({ _id: 'doe123'}, { _id: 'doe123', name: 'John Doe'}, { upsert: true});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
所以我尝试了另一件事并在“名称”上创建了一个unique index。
插入重名的结果:
> db.foo.update({ _id: 'foo456'}, { _id: 'foo456', name: 'John Doe'}, { upsert: true});
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.foo index: name_1 dup key: { : \"John Doe\" }"
}
})
为什么我在重复的_id 上没有收到这种错误?
编辑:我使用的是 MongoDB v.3.2.3
【问题讨论】:
标签: mongodb unique-index nosql