Mongodb 根据对象字段从由对象组成的数组中获取平均值
我有一份结构如下的文件:Mongodb 根据对象字段从由对象组成的数组中获取平均值,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一份结构如下的文件: { "_id" : ObjectId("598446bb13c7141f1"), "trackerId" : "598446ba-fa9b-4000-8000-4ea290e", "powerMetrics" : [ { "duration" : 0.15, "powerConsumption" : 0.1 }, { "du
{
"_id" : ObjectId("598446bb13c7141f1"),
"trackerId" : "598446ba-fa9b-4000-8000-4ea290e",
"powerMetrics" : [
{
"duration" : 0.15,
"powerConsumption" : 0.1
},
{
"duration" : 0.1,
"powerConsumption" : 0.05
}
]
}
我的目标是得到另一个文档,它将包含一个avgMetric值。此avgMetrics
应使用powerMetrics数组按以下方式计算:
(powerMetrics[0].powerConsumption/powerMetrics[0].duration
+ powerMetrics[1].powerConsumption/powerMetrics[1].duration) / powerMetrics.size()
因此,这个avgMetrics
应该表示powerMetrics
数组中所有(功耗/持续时间)的平均值
在尝试查询之后,我无法实现这一点
powerMetrics阵列的大小可能会有所不同,Mongo db版本为3.2.14
有人能帮忙吗
谢谢您可以使用
$map
和$avg
在3.2 mongo版本中输出avg
db.col_name.aggregate(
[{"$project":{
"avgMetrics":{
"$avg":{
"$map":{
"input":"$powerMetrics",
"as":"val",
"in":{"$divide":["$$val.powerConsumption","$$val.duration"]}
}
}
}
}}])
db.collection.aggregate(
// Pipeline
[
// Stage 1
{
$unwind: {
path: "$powerMetrics",
preserveNullAndEmptyArrays: true // optional
}
},
// Stage 2
{
$group: {
_id: '$_id',
metrics: {
$addToSet: {
$divide: ['$powerMetrics.powerConsumption', '$powerMetrics.duration']
}
}
}
},
// Stage 3
{
$project: {
avgVal: {
$avg: '$metrics'
}
}
},
]
);