如何对MongoDB聚合结果的对象数组按日期求和生成图表所需数据
解决方案
方法1:在MongoDB聚合管道中直接处理
你可以在原有聚合逻辑后追加3个阶段实现需求,步骤如下:
- 用
$unwind操作符展开charts数组,将每个数组成员拆分为独立文档 - 同时按文档主键
_id和子文档的date字段分组,累加相同日期的consumption值,同时保留外层的总consumption字段 - 再次按文档主键
_id分组,将处理后的子文档重新组装为charts数组,同时保留外层总consumption字段
对应聚合代码:
db.collection.aggregate([ // 此处保留你之前的聚合查询逻辑,追加以下3个阶段即可 { $unwind: "$charts" }, { $group: { _id: { rootId: "$_id", date: "$charts.date" }, rootConsumption: { $first: "$consumption" }, monthConsumption: { $sum: "$charts.consumption" } } }, { $group: { _id: "$_id.rootId", consumption: { $first: "$rootConsumption" }, charts: { $push: { date: "$_id.date", consumption: "$monthConsumption" } } } } ])
方法2:在服务端/前端用JavaScript处理已查询到的结果
如果你不想修改现有聚合逻辑,拿到结果后直接遍历处理即可,代码如下:
// rawResult为你当前查询得到的原始结果数组 const processedResult = rawResult.map(item => { // 统计每个日期的总消费 const dateCount = item.charts.reduce((acc, curr) => { acc[curr.date] = (acc[curr.date] || 0) + curr.consumption return acc }, {}) // 组装为预期结构 return { ...item, charts: Object.entries(dateCount).map(([date, consumption]) => ({ date, consumption })) } })
内容的提问来源于stack exchange,提问作者Mohamed Adel Lotfy
相关产品推荐
相关产品推荐

