Arrays 使用MongoDB向上插入项目数组

Arrays 使用MongoDB向上插入项目数组,arrays,node.js,mongodb,Arrays,Node.js,Mongodb,我有一个要插入MongoDB集合的对象数组,但是我想先检查集合中是否已经存在每个项。如果它不存在,则插入它;如果它确实存在,则不插入它 在谷歌搜索之后,看起来我最好使用upsert属性设置为true的update方法 如果我只传递一个项目,或者迭代数组,一次插入一个项目,那么这似乎很好,但是我不确定这是正确的方法还是最有效的方法。以下是我目前正在做的事情: var data = [{}, {}, ... {}]; for (var i = 0; i < data.length; i++)

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

在谷歌搜索之后,看起来我最好使用upsert属性设置为true的update方法

如果我只传递一个项目,或者迭代数组,一次插入一个项目,那么这似乎很好,但是我不确定这是正确的方法还是最有效的方法。以下是我目前正在做的事情:

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
      }

  });

}
var data=[{},{},{},{}];
对于(变量i=0;i

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

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

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

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

太好了,这正是我需要的。我确实是从尝试插入整个阵列开始的,当它遇到重复时失败并停止,这就是为什么我认为我可能需要按照问题中概述的方式进行插入。我不知道您可以使用无序插入继续插入,即使某些插入失败。谢谢@Sylvain Leroux从Mongo 3.3开始,这仍然是实现这一目标的最佳方式吗?看起来效率很低。谢谢。@Stanislasdrg我快速查看了3.4发行说明(),没有发现任何可能使其无效的内容,或者我错过了它?关于这是“低效的”:你能详细说明一下吗?FWIW,使用索引将允许在接触数据之前早期检测碰撞。这还将确保插入是原子性的,因为它是一种先读后写的解决方案,所以如果两个并发访问同时试图修改同一文档,您将不会有一个并发读取操作,也不会有争用条件。@SylvainLeroux我是Mongo的新手,所以我想看看这是不是最好的方法。来自于SQL,我曾经批量插入。谢谢你周到的答复。s