我对NoSQL数据库完全陌生,目前我正在使用MongoDB。MongoDB - 为什么_id索引不会在重复条目上抛出错误?
我试图理解为什么默认_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
。
upserting重复名称的结果:
> 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
我尝试了一些东西,我得到的异常/错误我期望使用** insert **而不是** upsert **:'“E11000重复键错误集合:test.foo索引:_id_ dup键:{:\“doe123 \”}“'。那么为什么插入会抛出错误,但upsert不会呢?仅仅因为它抬头*“我需要更新什么吗?不是吗?比我什么都不做”*? – Krenor
'upsert:true'意味着它将插入,如果字段不存在,否则它只会更新值。在插入的情况下,它会尝试插入记录,该记录实际上具有“_id”的重复值。我希望现在很清楚。 – Shrabanee
我已经更新了我的答案。 – Shrabanee