繁体   English   中英

使用MongoDB Upsert一系列项目

[英]Upsert an array of items with 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
      }

  });

}

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

根据您的具体需求,我可以在这里看到两个选项:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM