使用MongoDB Upsert一系列项目

时间:2015-05-09 09:37:25

标签: arrays node.js mongodb

我有一个我想要插入到MongoDB集合中的对象数组,但是我想先检查集合中是否已存在每个项目。如果它不存在则插入它,如果它存在则不要插入它。

经过一些谷歌搜索后,看起来我最好使用update方法,并将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
      }

  });

}

迭代我的数组并逐个插入它们是最有效的方法,还是有更好的方法?

1 个答案:

答案 0 :(得分:2)

我可以在这里看到两个选项,具体取决于您的完全需求:

  • 如果您需要插入或更新,请使用upsert query。在这种情况下,如果对象已经存在,您将更新它 - 假设您的文档将包含一些内容,这意味着您可能会覆盖某些字段的先前值。如您所知,使用$setOnInsert可以缓解此问题。
  • 如果您需要插入或忽略,请在相关字段中添加unique index,并在重复键上插入失败。由于要插入多个文档,您可以使用unordered insert将它们全部发送到数组中(即:将ordered选项设置为false),以便MongoDB继续插入其余文档如果其中一个出错。

关于性能,使用第二个选项MongoDB将使用索引来查找可能的重复。所以很有可能这会表现得更好。