【问题标题】:Mongodb Aggregate query to sum all values based on fields inside objects in an ArrayMongodb聚合查询根据数组中对象内的字段对所有值求和
【发布时间】:2020-12-11 05:23:23
【问题描述】:

我在 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
}

我如何实现这一目标?提前致谢。

【问题讨论】:

    标签: mongodb mongodb-query nosql aggregation-framework nosql-aggregation


    【解决方案1】:
    • $unwind解构metadata数组
    • $grpup by titleval 的总和
    • $group by 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

    【讨论】:

    • 当我尝试对实际数据运行此查询时出现此错误 - $arrayToObject 需要一个带有键“k”和“v”的对象,其中“k”的值必须是字符串类型.找到的类型:null
    • title 或 val 字段中会有一些 null 或空值。你能确定它在哪里吗?
    • 想通了。错误是从我这边来的。谢谢!! :)
    【解决方案2】:

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

    这里是mongo playground 供您参考。

    【讨论】:

    • 谢谢!!当我们不知道字段值 High、Medium、Low 时,有没有办法通过基于唯一标题值进行隔离来实现这一点?
    • @Ray 帖子太旧了,最新版本是可能的,我刚刚回答了take a look
    • @turivishal 是的,你是对的,你的答案应该是被接受的:)
    猜你喜欢
    • 2020-07-27
    • 2015-06-16
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2021-01-09
    • 2020-04-28
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多