2015-05-09 50 views
2

我有一個想插入到MongoDB集合中的對象數組,但是我想檢查每個項目是否已經存在於集合中。如果它不存在,則插入它,如果它存在,則不要插入它。用MongoDB插入項目數組

經過一些谷歌搜索,它看起來像我最好使用更新方法與upsert屬性設置爲true。

這似乎工作正常,如果我通過它一個單一的項目,以及如果我遍歷我的數組,並一次插入一個項目,但我不知道這是否是正確的方法來做到這一點,或者如果它是最有效的。下面是我目前在做什麼:

var data = [{}, {}, ... {}]; 

for (var i = 0; i < data.length; i++) { 

    var item = data[i]; 

    collection.update(
    {userId: item.id}, 
    {$setOnInsert: item}, 
    {upsert: true}, 
    function(err, result) { 

     if (err) { 
     // Handle errors here 
     } 

    }); 

} 

是遍歷我的數組和插入他們一個接一個最有效的方式做到這一點,還是有更好的辦法?

回答

2

我可以在這裏看到兩個選項,根據您的具體需要

  • 如果需要插入或更新使用upsert query。在這種情況下,如果對象已經存在,您將更新它 - 假設您的文檔將包含一些內容,這意味着您可能會覆蓋某些字段的先前值。正如你注意到的,使用$setOnInsert可以緩解這個問題。
  • 如果您需要插入或忽略在相關字段中添加unique index,並讓插入在重複鍵上失敗。由於您需要插入多個文檔,因此您可以使用unordered insert(即將ordered選項設置爲false)將它們全部發送到數組中,以便MongoDB在其中一個文件發生錯誤時繼續插入其餘文檔。

至於性能方面,第二個選項是MongoDB將使用索引來查找可能的重複。所以這個機會會更好。

+1

完美,這正是我需要的。我的確開始嘗試插入整個數組,當它遇到重複時失敗並停止,這就是爲什麼我想我可能需要按照我在問題中概述的方式來完成它。我不知道你可以使用無序插入來繼續插入,即使一些插入失敗。謝謝! – joshfarrant