【问题标题】:MongoDB - update multiple documents solution - update document counter or insert if doesn't existMongoDB - 更新多个文档解决方案 - 如果不存在则更新文档计数器或插入
【发布时间】:2020-05-22 21:52:57
【问题描述】:

我有以下titles 集合结构:

[
   ...,
   { 
      "_id" : ...,
      "title": "some title",
      "counter": 3
   }, 
   { 
      "_id" : ...,
      "title": "some title 2",
      "counter": 1
   }, 
   ...
]

给定一个标题列表(例如“title1”、“title2”等),如果它不存在,我想插入带有计数器 1 的标题,或者如果它已经存在,则将计数器增加 1。

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

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

谢谢!

(P.S - 我看到很多关于“增量或插入不存在”的帖子,但很多人都没有找到解决方案)

【问题讨论】:

标签: mongodb mongodb-query


【解决方案1】:

所以如果你有多个过滤器,那么你通常会使用$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() 也会对数据库执行多个更新操作,但是通过使用它可以避免执行多个数据库调用。

【讨论】:

  • 不错。在服务器上使用批量是最佳做法吗?因为在文档中它位于“mongo shell”下。
  • @user3343396 :是的,如果您想减少bulkwrite中的数据,可以使用而不是进行多次db调用来实现相同的效果,您可以分块数据并在调用中多次调用bulkwrite
猜你喜欢
  • 2015-01-14
  • 2018-04-05
  • 2020-09-05
  • 2019-08-04
  • 2017-03-07
  • 2021-04-24
  • 2014-02-16
  • 1970-01-01
相关资源
最近更新 更多