2015-10-23 88 views
4

假設我有一個要插入的文檔列表。具有唯一索引的MongoDB批插入

中的文檔結構如下

{ 
    url: string, 
    visited: boolean 
} 

我對url鍵唯一索引。

當我插入文檔時,如果找到1個重複項,則整個操作會中止。

有沒有辦法讓我仍然可以使用批量插入,它會插入所有不重複的文件?

作爲一種解決方法,我必須逐個插入文檔,並且擔心插入開銷會對性能造成影響。

回答

3

假設我有一個由.getIndexes()

> db.collection.getIndexes() 
[ 
     { 
       "v" : 1, 
       "key" : { 
         "_id" : 1 
       }, 
       "name" : "_id_", 
       "ns" : "test.collection" 
     }, 
     { 
       "v" : 1, 
       "unique" : true, 
       "key" : { 
         "a" : 1 
       }, 
       "name" : "a_1", 
       "ns" : "test.collection" 
     } 
] 

輸出命名a作爲秀場唯一索引的收集和文檔下面的數組:

var docs = [ { 'a': 3 }, { 'a': 4 }, { 'a': 3 } ]; 

你可以使用Bulk() API將這些文檔的批量插入到您的收藏中,但您需要使用允許MongoD的unordered operations B繼續處理列表中剩餘的寫入操作,即使在處理其中一個寫入操作期間發生錯誤。

var docs = [{a: 3}, {a: 4}, {a: 3}] 
var bulk = db.collection.initializeUnorderedBulkOp(); 
for(var ind=0; ind<docs.length; ind++) { 
    bulk.insert(docs[ind]); 
} 
bulk.execute(); 

查詢,但不重複的文件,將您的收藏中插入的執行後,您會收到一條錯誤消息。

這裏我們收集了術前空,但調用bulk.execute()db.collection.find()後得到以下文件:

{ "_id" : ObjectId("5629c5d1e6d6a6b8e38d013c"), "a" : 3 } 
{ "_id" : ObjectId("5629c5d1e6d6a6b8e38d013d"), "a" : 4 } 
0

不得不看看使用upsert?​​

相關問題