我有以下titles
集合结构:
[
...,
{
"_id" : ...,
"title": "some title",
"counter": 3
},
{
"_id" : ...,
"title": "some title 2",
"counter": 1
},
...
]
给定标题列表(例如"title1"、"title2"等(,如果标题不存在,我想插入带有计数器 1 的标题,或者如果计数器已经存在,则将其递增 1。
我可以在 1 个 mongo 查询中对多个标题执行此操作吗?
我知道我可以为每个标题运行更新查询,但它似乎效率低下。
谢谢!
(P.S - 我看到很多关于"增量或插入不存在"的帖子,但没有找到很多解决方案(
因此,如果您有多个过滤器,那么您通常会使用$in
运算符,因此,如果您喜欢:
db.getCollection('collectionName').updateMany(
{title: {$in : ["some title", "some title 3"]}},
{$inc : {counter: 1}}, {upsert : true})
上面,查询只会更新匹配的文档,但不更新。由于您有多个过滤器,因此您可以利用 .bulkwrite((,它可以具有一组高达 100k 的操作。
let bulkArr = [];
let titles = ["some title", "some title3"];
for (const title of titles) {
bulkArr.push({
updateOne: {
filter: { ...{title} },
update: { $inc: { counter: 1 } },
upsert : true
},
});
}
db.collection.bulkWrite(bulkArr);
此.bulkWrite()
还将对数据库执行多个更新操作,但通过使用它,您可以避免执行多个数据库调用。