【问题标题】:grand total in MongoDB aggregationMongoDB 聚合中的总计
【发布时间】:2021-12-29 02:38:05
【问题描述】:

我有一个对象数组,需要在管道输出的字段中包含总的值。

[
  {
    "_id": NumberInt(1),
    "absences": 170.0,
    "dayNumber": NumberInt(1),
    "dayName": "Sunday"
  },
  {
    "_id": NumberInt(2),
    "absences": 130.0,
    "dayNumber": NumberInt(2),
    "dayName": "Monday"
  }
]

我想要的结果包括 totalAbsences 键,它汇总了所有文档的缺勤情况。

[
  {
    "_id": 1,
    "absences": 170,
    "dayName": "Sunday",
    "dayNumber": 1,
    "totalAbsences": 300
  },
  {
    "_id": 2,
    "absences": 130,
    "dayName": "Monday",
    "dayNumber": 2,
    "totalAbsences": 300
  }
]

我可以使用下面的代码get the grand total,但我会丢失管道中的所有其他值。如何将totalAbsences 添加到每个文档并保留已在管道中的内容?这个Mongo Playground 模拟了数据。

{
    _id: null,
        total: { 
            $sum: "$absences" 
        } 
}

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    在 MongoDB 5.0 版中,您可以使用新的$setWindowFields(),它更简单,而且很可能也更快:

    db.collection.aggregate([
      {
        $setWindowFields: {
          output: {
            totalAbsences: { $sum: "$absences" }
          }
        }
      }
    ])
    

    【讨论】:

    • 这将是MongoDB将M0客户升级到v5时的完美解决方案。
    【解决方案2】:
    db.collection.aggregate([
      {
        $group: {
          _id: null,
          total: {
            $sum: "$absences"
          },
          items: {
            $push: "$$ROOT"
          }
        }
      },
      {
        $unwind: "$items"
      },
      {
        $replaceRoot: {
          "newRoot": {
            $mergeObjects: [
              {
                total: "$total"
              },
              "$items"
            ]
          }
        }
      }
    ])
    

    mongoplayground

    【讨论】:

    • 谢谢。这非常接近所需的输出。是否可以获取每个项目对象内的总数?
    • @It'sNotMe 我更新我的答案
    【解决方案3】:

    您可以使用$first$$ROOT 来保存文档。

    {
      _id: '$orgId',
      total: {
        $sum: '$createdAt'
      },
      "doc": { "$first": "$$ROOT" }
    }
    

    之后你可以使用$replaceRoot$mergeObjects

    {
      newRoot: { $mergeObjects : [{ total: '$total' }, '$doc']}
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多