首页 > 解决方案 > mongodb 插入多个文档,如果它们不存在,否则什么也不做

问题描述

我想存储用户输入自由格式的标签,以便在其他用户输入标签时将它们作为建议提供。

如何仅在我的建议集合中不存在该标签的位置插入用户输入的所有新标签?

例如,我有一个用户输入的标签数组:

[
   {"name": "tag 1"}, 
   {"name": "tag 2"}, 
   {"name": "tag 3"},
   {"name": "tag 4"},
   {"name": "tag 5"}
]

我要插入的集合已经有这些文档。

{ _id: <IDHERE>, "name": "tag 2" }
{ _id: <IDHERE>, "name": "tag 4" }
{ _id: <IDHERE>, "name": "tag 5" }

我想最终得到具有所有这些记录的集合,如下所示:

{ _id: <IDHERE>, "name": "tag 1" }
{ _id: <IDHERE>, "name": "tag 2" }
{ _id: <IDHERE>, "name": "tag 3" }
{ _id: <IDHERE>, "name": "tag 4" }
{ _id: <IDHERE>, "name": "tag 5" }

有没有办法用一条语句将上面的数组传递给该集合并让它插入{"name": "tag 1"}{"name": "tag 3"}忽略其他的,因为它们已经存在。?

标签: mongodbinsertnot-exists

解决方案


我不确定单个查询是否可行,您可以尝试upsert更新命令,例如在 js/nodejs 中,

  • 通过检查名称和集合名称来迭代标签数组和更新查询,
let tags = [{"name": "tag 1"}, {"name": "tag 2"}, {"name": "tag 3"}, {"name": "tag 4"}, {"name": "tag 5"}];

tags.forEach(function(tag) {
  db.collection.updateOne(
    { name: tag.name }, 
    { $set: { name: tag.name } },
    { upsert: true }
  )
});

操场


您可以使用bulkWrite()方法,

let bulkTags = [];

tags.forEach(function(tag) {
  bulkTags.push({
    updateOne: {
      filter: { name: tag.name },
      update: { $set: { name: tag.name } },
      upsert: true
    }
  });
});

db.collection.bulkWrite(bulkTags);

推荐阅读