mongodb |汇总后如何更新(查找和修改)

时间:2018-10-19 08:18:58

标签: mongodb aggregate findandmodify

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


如果条件为真,我想对“ 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
    }
}


从这个结果来看,我只想将'comment_sort'的值增加(+1)。

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

如何改进查询?

我想咨询。

致谢。

1 个答案:

答案 0 :(得分:1)

您无法通过聚集管道更新文档($ out阶段将替换整个集合)。但是,您可以使用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。组合过滤器对应于您的最后两个$ match阶段。

希望有帮助。

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