2

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


如果条件为真,我想要 +1 的“comment_sort”值。

条件:如果“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)

如何改进查询?

我想要建议。

问候。

4

1 回答 1

1

您无法从聚合管道更新您的文档($out 阶段将替换您的整个集合)。但是,您可以将聚合转换为带有位置过滤器的更新查询,以更新数组的匹配元素。这是查询:

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 个数组元素。(当然在这种情况下)

于 2018-10-19T09:02:00.870 回答