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

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 } }
])

逻辑说明

  1. 第一阶段和你原有写法逻辑一致,仅把统计结果别名改为monthTotal便于后续阶段识别
  2. 第二阶段以年份为分组键,用$sum累加所有月份的总金额得到年度总和,用$push把每个月的月份、金额拼成对象存入数组
  3. 第三阶段用$project调整字段名,去掉Mongo默认返回的_id字段,把分组用的年份提取为顶级year字段
    如果需要对月份数组排序,只需要放开上述代码中的排序阶段注释即可,返回的months内会按1-12月的顺序排列。

内容的提问来源于stack exchange,提问作者Paulo Calvo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:48:02