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

MongoDB聚合投影中如何为数组元素添加累计金额字段

MongoDB聚合管道实现数组元素累计求和(totalAmount)

解决方案

要给数组每个元素添加累计求和的totalAmount字段,你需要借助MongoDB的**窗口函数($setWindowFields)**处理跨元素的累计计算,后续可直接衔接分页逻辑,具体聚合阶段如下:

  1. $unwind 拆分数组
    先将items数组拆分为单个文档,为窗口函数计算累计值提供基础:

    { $unwind: "$items" }
    
  2. $setWindowFields 计算累计求和
    按指定顺序(示例中按date升序)计算每个元素的累计金额,确保累计范围是从第一个元素到当前元素:

    {
      $setWindowFields: {
        partitionBy: "_id", // 按原文档ID分组,保证同一文档的元素归为一组计算
        sortBy: { "items.date": 1 }, // 按日期排序,匹配示例中的累计顺序
        output: {
          totalAmount: {
            $sum: "$items.amount",
            window: { documents: ["unbounded", "current"] } // 累计范围:从第一个元素到当前元素
          }
        }
      }
    }
    
  3. $group 重组数组
    将拆分后的文档重新组合成items数组,并把计算好的totalAmount合并到对应元素中:

    {
      $group: {
        _id: "$_id",
        items: {
          $push: {
            amount: "$items.amount",
            type: "$items.type",
            date: "$items.date",
            totalAmount: "$totalAmount"
          }
        }
        // 若原文档有其他字段,需通过$first等操作保留,如:otherField: { $first: "$otherField" }
      }
    }
    
  4. 分页阶段
    完成累计计算后,可直接添加$limit、$skip实现分页:

    { $limit: 10 }
    

完整聚合管道示例

结合你的数据场景,完整聚合管道代码如下:

[
  // 这里是你之前的聚合逻辑,最终生成items数组
  // ...

  { $unwind: "$items" },
  {
    $setWindowFields: {
      partitionBy: "_id",
      sortBy: { "items.date": 1 },
      output: {
        totalAmount: {
          $sum: "$items.amount",
          window: { documents: ["unbounded", "current"] }
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id",
      items: {
        $push: {
          amount: "$items.amount",
          type: "$items.type",
          date: "$items.date",
          totalAmount: "$totalAmount"
        }
      }
    }
  },
  // 分页处理
  { $limit: 10 }
]

原$map方法的局限

$map仅能独立处理每个数组元素,无法访问前面元素的累计值,因此无法实现跨元素的累计求和逻辑,而窗口函数则专门解决这类范围计算问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:10:27