mongodb 如果文档不存在则插入多个文档,否则什么都不做

mongodb insert multiple documents if they don't exist otherwise do nothing

我想存储用户自由输入的标签,这样当其他用户输入标签时我可以将它们作为建议提供。

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

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

[
   {"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"} 并忽略其他的,因为它们已经存在。?

我不确定单个查询是否可行,您可以在更新命令中尝试 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 }
  )
});

Playground


可以使用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);