2015-05-09 54 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