Mongodb 聚合查询以根据数组中对象内的字段对所有值求和

Mongodb Aggregate query to sum all values based on fields inside objects in an Array

我在 MongoDB 中有一个集合 data,看起来像这样 -

文档 1-

{
    metadata:[
        {
            "title": "High",
            "val": 12
        },
        {
            "title": "Medium",
            "val": 15
        },
        {
            "title": "Low",
            "val": 2
        }
    ]
}

文档 2 -

{
    metadata:[
        {
            "title": "High",
            "val": 10
        },
        {
            "title": "Medium",
            "val": 12
        },
        {
            "title": "Low",
            "val": 20
        }
    ]
}

&等等..

我希望根据 title 值聚合 val 字段。 输出应该类似于 -

{
    "High": 22,
    "Medium": 27,
    "Low": 22
}

我该如何实现?提前致谢。

您可以先 $unwind metadata 数组。然后使用 $group 和 $cond 对您的值进行 $sum。

这里是mongo playground供您参考。

  • $unwind解构metadata数组
  • $grpup乘以title并求和val
  • $group null,$arrayToObject 将数组从键和值转换为对象,并使用 $mergeObjects
  • 合并对象
db.collection.aggregate([
  { $unwind: "$metadata" },
  {
    $group: {
      _id: "$metadata.title",
      sum: { $sum: "$metadata.val" }
    }
  },
  {
    $group: {
      _id: null,
      metadata: {
        $mergeObjects: {
          $arrayToObject: [
            [{ k: "$_id", v: "$sum" }]
          ]
        }
      }
    }
  }
])

Playground