需要获取嵌入式对象的所有字段的平均值,但每个对象都有另一个嵌入式对象。因此,首先必须导出内部嵌入对象的平均值。
尝试了几种变体。但没有得到理想的结果。
[{
$project: {
vals: {
$objectToArray: "$values"
}
}
}, {
$unwind: {
path: "$vals",
}
}, {
$project: {
valInner: {
$objectToArray: "$vals.v"
}
}
}, {
$group: {
_id: "$valInner.k",
avg: {
$avg: "$valInner.v"
}
}
}]
json看起来像这样:
{
"_id": {
"$oid": "5cf8132d528a1809fc6bad64"
},
"values": {
"0": {
"0": 0,
"1": 0,
"2": 0,
"3": 0,
"4": 10,
"5": 20,
"6": 0,
"7": 10,
"8": 0,
"9": 0,
"10": 0,
"11": 0,
...
...
...
"57": 0,
"58": 0,
"59": 0
},
"1": {},
"2": {},
...
"60": {}
},
"event_hour": {
"$date": "2019-06-05T19:16:02.524+0000"
}
}
汇总后的预期输出应为:
{
"_id": {
"$oid": "5cf8132d528a1809fc6bad64"
},
"values": avgValue,
"event_hour": {
"$date": "2019-06-05T19:16:02.524+0000"
}
}
答案 0 :(得分:0)
使用管道中的以下步骤解决了该问题。
1)投影主对象并将其转换为数组。 2)展开该阵列。 3)投影并将内部嵌入的对象转换为数组。 4)放松。 5)将其分组为id并计算平均值。
[
{$project: {values : {$objectToArray : "$values"}}},
{$unwind: {path: "$values"}},
{$project: {values:{$objectToArray:"$values.v"}}},
{$unwind: {path: "$values"}},
{$group: {_id: "$_id",hour_avg: {$avg:"$values.v"}}}
]