java - 如何聚合 mongodB 集合中所有文档的映射键?

标签 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 映射值求和? 注意:第一个文档中不存在“运费”,但我们仍然需要所有文档中此键的总和。此外,按键可能会有所不同,无法事先知道按键的名称。

最佳答案

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

然后,您可以 $unwind 数组,并按 RevenueHeader.k 分组,对 RevenueHeader.v 求和。通过这种方式,您无需关心 RevenueHeader 中的字段名称或存在。

这是查询:

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

你可以测试一下here

关于java - 如何聚合 mongodB 集合中所有文档的映射键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59446154/

相关文章:

java - 非常简单的一步一步的 JBehave 设置教程?

java - Spring JDBC 依赖问题

带有十进制索引的 JavaScript 数组

php - 如何使用 PHP 和 MySQLi 对照另一个多维数组检查一个多维数组值并根据结果更新批量数据?

node.js - MongoDB连接不断增加

mongodb - 如何将来自不同数组的两个匹配对象合并为一个对象?

java - 如何在构造函数中用随机整数填充数组? (二维数组)

java - 如何在抽屉布局(带有抽屉导航菜单)中使用Android导航组件(导航图)?

c++ - 将一种类型的数组转换为另一种类型

c# - 尝试从我的 Mongo 数据库中的所有文档中获取单个字段的列表