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 个数组元素将递增。 (当然是在这种情况下)
我想在查询执行后根据结果更新一些值。
如果条件为真,我想为 "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 个数组元素将递增。 (当然是在这种情况下)