Mongo集合按年聚合后按月嵌套统计金额的实现方案咨询
可行聚合实现方案
你可以通过「年月分组统计→按年二次聚合→字段格式调整」三个核心阶段实现需求,完整代码如下:
db.collection.aggregate([ // 阶段1:按年+月维度分组,先算出每个月的总金额 { $group: { _id: { year: { $year: "$Date" }, month: { $month: "$Date" } }, monthTotal: { $sum: "$Amount" } } }, // 可选补充:如果需要months数组内的月份按从小到大排序,可在此处添加排序阶段 // { $sort: { "_id.year": 1, "_id.month": 1 } }, // 阶段2:按年份二次分组,统计年度总金额,同时把各月数据推入数组 { $group: { _id: "$_id.year", sumAmount: { $sum: "$monthTotal" }, months: { $push: { month: "$_id.month", amount: "$monthTotal" } } } }, // 阶段3:调整输出字段结构,隐藏默认_id字段,匹配你需要的返回格式 { $project: { _id: 0, year: "$_id", sumAmount: 1, months: 1 } }, // 可选补充:按年份倒序排列返回结果,最新年份在前 { $sort: { year: -1 } } ])
逻辑说明
- 第一阶段和你原有写法逻辑一致,仅把统计结果别名改为
monthTotal便于后续阶段识别 - 第二阶段以年份为分组键,用
$sum累加所有月份的总金额得到年度总和,用$push把每个月的月份、金额拼成对象存入数组 - 第三阶段用
$project调整字段名,去掉Mongo默认返回的_id字段,把分组用的年份提取为顶级year字段
如果需要对月份数组排序,只需要放开上述代码中的排序阶段注释即可,返回的months内会按1-12月的顺序排列。
内容的提问来源于stack exchange,提问作者Paulo Calvo
相关产品推荐
相关产品推荐

