MongoDB $group聚合不使用$accumulator合并同天多电表小时耗量数组方法
可以实现,无需使用$accumulator,仅通过MongoDB内置的基础聚合算子即可完成需求,核心逻辑是按日期分组后将同小时维度的数值对齐后逐位求和,具体聚合管道如下:
db.collection.aggregate([ // 按日期分组,收集同日期所有电表的小时耗量数组 { $group: { _id: "$date", allMeterHourly: { $push: "$hourlyConsumption" } } }, // 按小时索引对齐,逐位求和得到合并后的总耗量数组 { $project: { _id: 0, date: "$_id", hourlyConsumption: { $map: { input: { $zip: { inputs: "$allMeterHourly" } }, as: "hourGroup", in: { $sum: "$$hourGroup" } } } } } ])
逻辑说明
$group阶段将同一日期下所有电表的hourlyConsumption数组合并为二维数组allMeterHourly,示例输入下该值为[[0,0,1,...], [10,10,10,...]]$zip算子会将二维数组按索引位置重新打包,得到每小时所有电表的耗量集合,示例中输出为[[0,10], [0,10], [1,10], ...]$map遍历每小时的耗量集合,用$sum求和即可得到对应小时的总耗量,最终输出符合要求的合并结果
如果存在部分文档hourlyConsumption长度不足24位的场景,可以在$zip参数中添加useLongestLength: true属性,缺失位置会默认按null处理,$sum会自动忽略null值不影响求和结果。
内容的提问来源于stack exchange,提问作者yunicz
相关产品推荐
相关产品推荐

