如何获取mongodb中嵌入式对象内所有字段的平均值?

时间:2019-06-27 09:05:16

标签: mongodb aggregation-framework

需要获取嵌入式对象的所有字段的平均值,但每个对象都有另一个嵌入式对象。因此,首先必须导出内部嵌入对象的平均值。

尝试了几种变体。但没有得到理想的结果。

  [{
$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"
}
}

1 个答案:

答案 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"}}}
]