You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB聚合:为所有文档添加values全局求和的sum字段

给集合所有文档添加全局values总和的sum字段

需求说明

需要计算集合中所有文档values字段的总和,并将该值作为sum字段添加到每一条原始文档中。之前尝试用$group操作,但只会返回单条聚合结果,现在要保留所有原始文档同时附带计算出的sum值。

示例原始文档

[
  {
    "_id": ObjectId("5407c76b7b1c276c74f90524"),
    "field": "x",
    "values": 1
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90525"),
    "field": "x",
    "values": 1
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90526"),
    "field": "z",
    "values": 1
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90527"),
    "field": "x",
    "values": 1
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90528"),
    "field": "z",
    "values": 1
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90529"),
    "field": "y",
    "values": 1
  }
]

预期结果

[
  {
    "_id": ObjectId("5407c76b7b1c276c74f90524"),
    "field": "x",
    "values": 1,
    "sum": 6
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90525"),
    "field": "x",
    "values": 1,
    "sum": 6
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90526"),
    "field": "z",
    "values": 1,
    "sum": 6
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90527"),
    "field": "x",
    "values": 1,
    "sum": 6
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90528"),
    "field": "z",
    "values": 1,
    "sum": 6
  },
  {
    "_id": ObjectId("5407c76b7b1c276c74f90529"),
    "field": "y",
    "values": 1,
    "sum": 6
  }
]

解决方案

方法一:传统聚合管道组合(兼容全版本)

使用$group、$unwind、$replaceRoot组合实现:

db.yourCollectionName.aggregate([
  // 计算全局总和并保存所有原始文档
  {
    $group: {
      _id: null,
      totalSum: { $sum: "$values" },
      docs: { $push: "$$ROOT" }
    }
  },
  // 拆分保存的文档数组
  {
    $unwind: "$docs"
  },
  // 合并原始文档与sum字段,恢复原始结构
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [ "$docs", { sum: "$totalSum" } ]
      }
    }
  }
])

方法二:窗口函数简化实现(MongoDB 4.2+)

用$setWindowFields一步完成全局计算:

db.yourCollectionName.aggregate([
  {
    $setWindowFields: {
      partitionBy: null, // 全局范围计算
      sortBy: {}, // 无需排序
      output: {
        sum: { $sum: "$values", window: { documents: ["unbounded", "unbounded"] } }
      }
    }
  }
])

步骤说明

  • 方法一中,$group负责汇总总和与原始文档,$unwind拆分数组,$replaceRoot合并字段恢复结构;
  • 方法二利用窗口函数直接计算全局范围内的values总和,代码更简洁高效。

内容的提问来源于stack exchange,提问作者reis12341

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:27:51