mongodb - 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"}
忽略其他的,因为它们已经存在。?
解决方案
我不确定单个查询是否可行,您可以尝试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);
推荐阅读
- c# - Deserializing returning null even though the response is 200
- sap-basis - 在 SAP 中收到一封电子邮件而不是几封
- javascript - 链接到 Express 反应而不创建反应应用程序
- android - 在 Flutter 路由上传递变量
- c# - 打开/关闭 sql 连接的问题
- c# - 在android上删除元素时查看单元格绑定导致崩溃
- python - Django 本地字体
- react-tsx - React Ts, Access Parents state from Child
- python-3.x - 如何添加第一个元素满足条件的元组的第二个元素?
- java - 如何访问 Java (Intellij) 中的资源文件?