如何在mongodB集合中的所有文档上汇总映射键?

时间:2019-12-22 16:44:26

标签: java arrays mongodb mongodb-query aggregation-framework

我的数据格式如下:

[{
"OrderId": "406-5309498-5972326",
"revenueHeader": {
"Principal": 982.14,
"Product Tax": 117.86,
"Total": 1100
}},
{
"OrderId": "506-5234568-5934567",
"revenueHeader": {
"Principal": 382.54,
"Product Tax": 34.46,
"Shipping charge": 30.5,
"Giftwrap charge": 27.5,
"Total": 234
}}]

如何汇总所有文档中键的RevenueHeader映射值? 注意:第一个文档中没有“运费”,但我们仍希望所有文档中此键的总和。另外,键可能会有所不同,因此无法事先知道键的名称。

2 个答案:

答案 0 :(得分:1)

您必须使用$objectToArray来转换{k,v}对象数组中的RevenueHeader。

然后,您可以对数组进行$ unwind,并按RevenueHeader.k分组,将RevenueHeader.v相加。通过这种方式,您将永远不必在意RevenueHeader中的字段名称或状态。

这是查询:

db.collection.aggregate([
  {
    $project: {
      revenueHeader: {
        $objectToArray: "$revenueHeader"
      }
    }
  },
  {
    $unwind: "$revenueHeader"
  },
  {
    $group: {
      _id: "$revenueHeader.k",
      total: {
        $sum: "$revenueHeader.v"
      }
    }
  }
])

您可以here对其进行测试

答案 1 :(得分:0)

如果您不确定要在其中获得多少字段的总和,那么可以使用@matthPen提供的解决方案。

但是,如果您知道所有可能出现的字段,则可以直接将$ group阶段与键名一起使用。我个人避免在文档数量很大的情况下使用$ unwind。

[ 
    { 
        $group: { 
            _id: null,
            "Principal": { $sum: "$revenueHeader.Principal" },
            "Product Tax": { $sum: "$revenueHeader.Product Tax" },
            "Shipping charge": { $sum: "$revenueHeader.Shipping charge" },
            "Giftwrap charge": { $sum: "$revenueHeader.Giftwrap charge" },
            "Total": { $sum: "$revenueHeader.Total" },
        } 
    } 
]