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

MongoDB 4.2聚合:如何在$reduce的in阶段同步计算total字段

解决方案

完全可以在当前的$reduce的in阶段中同时计算total字段,不需要新增额外的$addFields阶段或第二个$reduce。只需要在每个$switch分支的then逻辑里,用$mergeObjects合并对象时,同时对total进行累加操作即可。

修改后的聚合阶段代码如下:

$addFields: {
  stats: {
    $reduce: {
      input: '$values',
      initialValue: {
        x: { value: 0 },
        y: { value: 0 },
        z: { value: 0 },
        total: 0
      },
      in: {
        $switch: {
          branches: [
            { 
              case: { $eq: [ '$$this._id', 'x' ] }, 
              then: { 
                $mergeObjects: [
                  '$$value', 
                  {
                    'x': {'value': '$$this.value'},
                    'total': {$add: ['$$value.total', '$$this.value']}
                  }
                ]
              } 
            },
            { 
              case: { $eq: [ '$$this._id', 'y' ] }, 
              then: { 
                $mergeObjects: [
                  '$$value', 
                  {
                    'y': {'value': '$$this.value'},
                    'total': {$add: ['$$value.total', '$$this.value']}
                  }
                ]
              } 
            },
            { 
              case: { $eq: [ '$$this._id', 'z' ] }, 
              then: { 
                $mergeObjects: [
                  '$$value', 
                  {
                    'z': {'value': '$$this.value'},
                    'total': {$add: ['$$value.total', '$$this.value']}
                  }
                ]
              } 
            }
          ],
          default: '$$value'
        }
      }
    }
  }
}

改动说明

  • 在每个分支的then部分,使用$mergeObjects合并原有状态($$value)时,除了更新对应_id的value字段,同时通过$add将当前元素的value累加到total上。
  • 遍历values数组的过程中,每处理一个元素就完成一次对应字段更新和total累加,最终得到包含各字段值和总和的stats对象。

内容的提问来源于stack exchange,提问作者Jonathan La'Fey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:38:18