我對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