我有一份以下结构的文件:
{
"_id" : ObjectId("598446bb13c7141f1"),
"trackerId" : "598446ba-fa9b-4000-8000-4ea290e",
"powerMetrics" : [
{
"duration" : 0.15,
"powerConsumption" : 0.1
},
{
"duration" : 0.1,
"powerConsumption" : 0.05
}
]
}
我的目标是获取另一个文档,其中包含单个值avgMetric。应使用powerMetrics数组以下列方式计算此avgMetrics
:
(powerMetrics[0].powerConsumption/powerMetrics[0].duration
+ powerMetrics[1].powerConsumption/powerMetrics[1].duration) / powerMetrics.size()
因此,此avgMetrics
应代表powerMetrics
数组中所有(powerConsumption / duration)的平均值。
在尝试查询后,我无法实现这一目标,
powerMetrics
数组的大小可能不同,Mongo db版本为3.2.14
有人可以帮忙吗?
由于
答案 0 :(得分:2)
您可以使用$map
与$avg
一起输出3.2 mongo版本的平均值。
db.col_name.aggregate(
[{"$project":{
"avgMetrics":{
"$avg":{
"$map":{
"input":"$powerMetrics",
"as":"val",
"in":{"$divide":["$$val.powerConsumption","$$val.duration"]}
}
}
}
}}])
答案 1 :(得分:0)
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'
}
}
},
]
);