MongoDB-更新多文档解决方案-更新文档计数器或插入(如果没有';不存在

MongoDB-更新多文档解决方案-更新文档计数器或插入(如果没有';不存在,mongodb,mongodb-query,Mongodb,Mongodb Query,我有以下标题收藏结构: [ ..., { "_id" : ..., "title": "some title", "counter": 3 }, { "_id" : ..., "title": "some title 2", "counter": 1 }, ... ] 给定一个标题列表(例如“title1”、“title2”等),如果不存在,我想用计数器1插入标题,如果已经存在,

我有以下
标题
收藏结构:

[
   ...,
   { 
      "_id" : ...,
      "title": "some title",
      "counter": 3
   }, 
   { 
      "_id" : ...,
      "title": "some title 2",
      "counter": 1
   }, 
   ...
]
给定一个标题列表(例如“title1”、“title2”等),如果不存在,我想用计数器1插入标题,如果已经存在,则将计数器增加1

我可以在一个mongo查询中查询多个标题吗

我知道我可以为每个标题运行更新查询,但它似乎效率低下

谢谢


(另一方面,我看到了很多关于“增量或插入不存在”的帖子,但没有为许多人找到解决方案)

因此,如果你有多个过滤器,那么你通常会使用
$in
操作符,如果你喜欢:

db.getCollection('collectionName').updateMany(
        {title: {$in : ["some title",  "some title 3"]}},
         {$inc : {counter: 1}}, {upsert : true})
如上所述,查询只会更新匹配的文档,但不会进行upsert。因为您有多个过滤器,所以您可以利用这些过滤器进行一组高达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()
也会对数据库执行多个更新操作,但通过使用它,您可以避免执行多个数据库调用。

检查nice。在服务器上使用块是最佳做法?因为在文档中,它位于“mongo shell”下。@user3343396:是的,可以使用而不是执行多个db调用来实现相同的效果。如果您想减少bulkwrite中的数据,可以在调用中分块数据并多次调用bulkwrite