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

MongoDB按日期分组聚合:带条件$sum计算问题求助

解决MongoDB按日期分组统计状态及销售额的问题

我来帮你搞定这个聚合查询的问题!你的核心需求是按日期分组,统计不同状态的记录数以及对应状态的销售额总和,原来的代码主要有两个问题:一是没有用条件判断来精准计算符合状态的数量和销售额,二是分组仅用了dayOfMonth,容易导致不同月份的同一天被错误合并。

正确的聚合管道代码

db.collection.aggregate([
  {
    $group: {
      // 按年-月-日分组,确保同一天的记录归为一组
      _id: {
        year: { $year: "$createdAt" },
        month: { $month: "$createdAt" },
        day: { $dayOfMonth: "$createdAt" }
      },
      // 取当天最早的记录时间作为结果里的createdAt
      createdAt: { $min: "$createdAt" },
      // 统计active状态的记录数
      active: {
        $sum: {
          $cond: [{ $eq: ["$status", "active"] }, 1, 0]
        }
      },
      // 统计inactive状态的记录数
      inactive: {
        $sum: {
          $cond: [{ $eq: ["$status", "inactive"] }, 1, 0]
        }
      },
      // 统计active状态的销售额总和
      salesOfActive: {
        $sum: {
          $cond: [{ $eq: ["$status", "active"] }, "$sale", 0]
        }
      },
      // 统计inactive状态的销售额总和
      salesOfInactive: {
        $sum: {
          $cond: [{ $eq: ["$status", "inactive"] }, "$sale", 0]
        }
      }
    }
  },
  // 调整输出格式,移除默认的_id字段
  {
    $project: {
      _id: 0,
      createdAt: 1,
      active: 1,
      inactive: 1,
      salesOfActive: 1,
      salesOfInactive: 1
    }
  }
])

代码解释

  1. 分组逻辑:用year+month+day作为分组的_id,避免不同月份的同一天被合并;同时用$min获取当天最早的createdAt,和你期望的结果格式匹配。
  2. 条件统计:使用$cond操作符实现条件判断:
    • 统计记录数时,符合状态返回1,否则返回0,再用$sum累加总数;
    • 统计销售额时,符合状态返回对应的$sale值,否则返回0,再用$sum累加总和。
  3. 格式调整:通过$project阶段移除自动生成的_id字段,输出你需要的所有字段。

运行结果

针对你提供的示例数据,运行上述聚合后会得到完全符合预期的结果:

[
  {
    "createdAt": "2019-10-08 02:01:19",
    "active": 1,
    "inactive": 2,
    "salesOfActive": 4,
    "salesOfInactive": 10
  }
]

内容的提问来源于stack exchange,提问作者Abtisam Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:12:45