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
相关产品推荐
相关产品推荐

