在MongoDb中,我有一个包含以下数据的集合:
[{
_id: ObjectId('....'),
data: [{
type: 'internal',
name: 'abc',
value: 60
}, {
type: 'internal',
name: 'def',
value: 20
}, {
type: 'external',
name: 'def',
value: 20
}]
}, {
_id: ObjectId('....'),
data: [{
type: 'internal',
name: 'abc',
value: 30
}, {
type: 'internal',
name: 'def',
value: 40
}, {
type: 'external',
name: 'def',
value: 10
}]
}]
现在如果我想按类型进行分组并取平均值字段,我可以这样做
db.testcollection.aggregate([
{$unwind: '$data'},
{$group: {_id: '$data.type', avg: {$avg: '$data.value'}}}
]);
但是,如果必须处理一个相同类型文档的值有一个值(两者的总和)然后必须计算平均值,那么查询是什么?
在我的内部类型的示例中,它应该是:
((60+20)+(30+40))/2
而不是
(60+20+30+40)/4
答案 0 :(得分:1)
你可以在2个$组阶段完成。第一个用于计算文档中的总和,第二个用于计算文档的平均值。
db.testcollection.aggregate([
{$unwind: "$data"},
{$group: {_id: {_id:"$_id", type:"$data.type"}, sum:{"$sum": "$data.value"}}}
{$group:{_id:"$_id.type", avg:{"$avg":"$sum"}}}
]);