你需要先$group https://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group按“类型”分类的文档,请使用$sum https://docs.mongodb.org/manual/reference/operator/aggregation/sum/#grp._S_sum累加器运算符返回“k”的总和并使用$push https://docs.mongodb.org/manual/reference/operator/aggregation/push/#grp._S_push它返回“c”的二维数组。现在你需要两个“$放松” https://docs.mongodb.org/manual/reference/operator/aggregation/unwind/#pipe._S_unwind对“c”二维数组进行非规范化的阶段。管道中的最后一个阶段是另一个阶段$group https://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group使用“点表示法”计算“p”总和的阶段
db.collection.aggregate([
{ '$group': {
'_id': '$type',
'k': { '$sum': '$k' }, 'c': { '$push': '$c' }
} },
{ '$unwind': '$c' },
{ '$unwind': '$c' },
{ '$group': {
'_id': '$_id',
'k': { '$first': '$k' },
'c': { '$sum': '$c.p' }
}}
])
其产量:
{ "_id" : "dog", "k" : 2.2, "c" : 3.6 }
{ "_id" : "cat", "k" : 4.3, "c" : 9.7 }
从 3.2 版本开始 https://docs.mongodb.org/manual/release-notes/3.2/#accumulator-expression-availability,以下累加器表达式,以前仅在$group
阶段,现在也可以在$project
stage.
这意味着我们可以利用这一点并使用$sum
累加器运算符$project https://docs.mongodb.org/manual/reference/operator/aggregation/project/#pipe._S_project。当然$map
运算符为每个文档返回一个“p”数组。
db.collection.aggregate([
{ '$project': {
'type': 1,
'k': 1,
'c': {
'$sum': {
'$map': {
'input': '$c',
'as': 'subc',
'in': '$$subc.p'
}
}
}
}},
{ '$group': {
'_id': '$type',
'k': { '$sum': '$k' },
'c': { '$sum': '$c' }
}}
])
返回:
{ "_id" : "cat", "k" : 4.3, "c" : 9.7 }
{ "_id" : "dog", "k" : 2.2, "c" : 3.6 }