在$ addFields mongo聚合中添加一个字段,该字段是另一个字段的映射

时间:2019-03-14 15:40:05

标签: mongodb mongodb-query aggregation-framework

我有一个针对指标的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聚合查询来实现这一目标?

1 个答案:

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