mongodb |聚合后如何更新(查找和修改)

mongodb | How to update(findandmodify) after aggregate

我想在查询执行后根据结果更新一些值。


如果条件为真,我想为 "comment_sort" 值 +1。

条件: 如果 "comment_group" 为 1 且 "comment_sort" 大于 0


原始数据库是..

{
    "_id" : ObjectId("5bc984ef8e798ccb0309ef13"),
    "post_no" : 56,
    "username" : "a@a.aa",
    "nickname" : "nickNameSuccess",
    "post_content" : "56",
    "post_title" : "56"
    "comment" : [ 
        {
            "comment_no" : 238,
            "comment_sort" : 1,  // (+1) "comment_sort" : 2 
            "comment_depth" : 0,
            "comment_group" : 1
        }, 
        {
            "comment_no" : 240,
            "comment_sort" : 2, // (+1) "comment_sort" : 3
            "comment_depth" : 1,
            "comment_group" : 1
        }, 
        {
            "comment_no" : 235,
            "comment_sort" : 1,
            "comment_depth" : 0,
            "comment_group" : 2
        }, 
        {
            "comment_no" : 237,
            "comment_sort" : 2,
            "comment_depth" : 0,
            "comment_group" : 2
        }
    ]
}


查询是..

db.getCollection('post').aggregate([
    {"$match" : {"post_no": 56}},
    { "$project": {
    "comment": {
      "$map": {
        "input": "$comment",
        "in": {
          "comment_no": "$$this.comment_no",
          "comment_group": "$$this.comment_group",
          "comment_sort": "$$this.comment_sort",
          "comment_depth": "$$this.comment_depth"
        }
      }
    }
  }},
  { "$unwind": '$comment' },
  {"$match" : {"comment.comment_group": 1}},
  {"$match" : {"comment.comment_sort": {"$gt":0}} },
//   { $group: { _id: null, comment_sort: { $max: "$comment.comment_sort" }}}
])


结果是..

{
    "_id" : ObjectId("5bc984ef8e798ccb0309ef13"),
    "comment" : {
        "comment_no" : 238,
        "comment_group" : 1,
        "comment_sort" : 1,
        "comment_depth" : 0
    }
},
{
    "_id" : ObjectId("5bc984ef8e798ccb0309ef13"),
    "comment" : {
        "comment_no" : 240,
        "comment_group" : 1,
        "comment_sort" : 2,
        "comment_depth" : 1
    }
}


根据这个结果,我只想增加 (+1) 'comment_sort' 的值。

(例如 1 --> 2、2 --> 3)

如何改进查询?

我想征求意见。

此致。

您无法从聚合管道更新您的文档($out stage 将替换您的整个集合)。但是,您可以使用 positional filters 将聚合转换为更新查询,以更新数组的匹配元素。这是查询:

db.getCollection('post').update(
  {post_no:56},
  {$inc:{"comment.$[com].comment_sort":1}},
  {arrayFilters: [ {$and:[{"com.comment_group": 1},{"com.comment_sort": {"$gt":0}} ]}]  }
)

解释:

  • 第一个文档对应你的第一个匹配阶段。
  • 第二个文件是要执行的更新。 $[com] 是 arrayFilters 选项的标识符。
  • 第三个文件是选项文件,包含数组匹配元素arrayFilters 的过滤器。一个标识符必须有一个对应的 arrayFilter,所以使用 $and 作为过滤器。组合过滤器对应于您最后的 2 个 $match 阶段。

希望对您有所帮助。

编辑 更新时不执行任何类型的展开,因此查询结果将指示 1 个文档已更新。但是 2 个数组元素将递增。 (当然是在这种情况下)