我有一个针对指标的Mongo值集合,例如:
[
{"metric": "A", "value": 1.0},
{"metric": "B", "value": 0.5}
]
我想编写一个聚合查询,对它们进行加权平均,但是每个指标的权重不在集合中-它是在编写查询时动态设置的。
因此,我需要添加一个weight
字段,从metric字段映射到一些double。我已经尝试过了:
db.collection.aggregate([
{
$addFields: {
metricWeight: {"A": 2.0, "B": 5.0}["$metric"]
}
}
])
即。试图将地图内联定义为JS对象,然后使用metric
字段对其进行索引-但这给了我undefined
和每个metricWeight
一样。
管道的这一阶段的预期输出为:
[
{"metric": "A", "value": 1.0, "metricWeight": 2.0},
{"metric": "B", "value": 0.5, "metricWeight": 5.0}
]
有什么方法可以使用Mongo聚合查询来实现这一目标?
答案 0 :(得分:1)
您可以使用以下汇总
const object = { "A": 2.0, "B": 5.0 }
db.collection.aggregate([
{ "$addFields": {
"keys": {
"$objectToArray": object
}
}},
{ "$project": {
"metric": 1,
"value": 1,
"metricWeight": {
"$arrayElemAt": [
"$keys.v",
{ "$indexOfArray": ["$keys.k", "$metric"] }
]
}
}}
])