用MongoDB向上插入项目数组

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

谷歌search后,看起来像我最好使用更新方法与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将使用索引来查找可能的重复。 所以机会是好的,这将performance更好。