2014-03-30 82 views
1

我用下面插入對象的數組到MongoDB的(我分配一個唯一的_id),這是工作:MongoDB中插入多個文件,其中重複的_id可能

collection.insert(records, {w:1}, function(err, result) 

這是可能的某些記錄可能有重複的_id(意味着記錄已經在數據庫中)。以下是錯誤我得到:

MongoError: E11000 duplicate key error index: heroku_app23495772.records.$_id_ dup key: { : "2b09aadb900f0e5112b6d03f665fb946" } 

威爾的MongoDB在遇到的第一個對象(副本)上的錯誤後,仍然插入此數組中其餘的對象?我真的不介意這個錯誤,如果它不會阻止剩餘的不重複的文檔被插入或影響其他負面的文檔。

或者,我應該在發送對象數組之前逐字查詢數據庫以查看它是否存在?我認爲這樣做不會是最好的表現。

我只是想弄清楚處理這些重複的最有效的方法。

回答

0

_id在集合中必須是唯一的,所以不能用相同的_id插入2個文檔。

不確定你確切的用例是什麼,但你有另一種方法,比如做一個upsert或save。

如果你做一個collection.save的文件將被替換: http://docs.mongodb.org/manual/reference/method/db.collection.save/

如果你做一個更新,與UPSERT:真的,你可以控制需要更新或創建的內容: http://docs.mongodb.org/manual/reference/method/db.collection.update/#insert-a-new-document-if-no-match-exists-upsert

如果這沒有幫助,可否請您給我們提供您正在嘗試實現的確切用例,並記住如果您沒有提供任何_id,系統將爲您生成一個。

4

好的,我終於得到了這個工作。包括continueOnError: true將繼續插入批次的其餘部分,即使有些未插入是因爲它們是重複的。

collection.insert(records, {continueOnError: true}, function(err, result) { 
+0

如果{continueOnError:true}本身不起作用(因爲它不適用於我),可能希望添加{keepGoing:true}。最終結果將簡單地爲{keepGoing:true,continueOnError:true} – Leon

相關問題