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

MongoDB Aggregate $sum按日期范围统计数量结果恒为0问题求解

问题原因分析

你当前写法返回0是存在三个核心错误:

  • $and 运算符接收的参数必须是数组格式,你使用了对象写法,不符合MongoDB聚合语法规则
  • 条件判断中引用文档字段需要加$前缀,你写的"date"应改为"$date"
  • $sum 仅对布尔判断结果求和,没有关联quantity字段,就算语法修正后统计的也是符合条件的文档数,不是quantity的总和
最优解决方案(单时间段统计,性能更高)

如果仅需要统计近90天的总和,推荐先加$match阶段过滤掉不符合日期范围的文档,减少后续分组的计算量,查询效率更高:

// mongoose 聚合查询写法
const ninetyDaysAgo = dayjs().subtract(90, 'd').toDate();
const now = dayjs().toDate();

myCollection.aggregate([
  // 先过滤符合日期范围的文档
  {
    $match: {
      date: {
        $gte: ninetyDaysAgo,
        $lt: now
      }
    }
  },
  // 按itemNumber分组求和quantity
  {
    $group: {
      _id: '$itemNumber',
      ninetyDays: { $sum: '$quantity' }
    }
  }
])
多时间段统计写法

如果你需要在同一次分组中统计多个不同日期范围的总和,可以用$cond做条件判断,符合条件时累加quantity,否则加0:

myCollection.aggregate([
  {
    $group: {
      _id: '$itemNumber',
      // 近90天统计
      ninetyDays: {
        $sum: {
          $cond: [
            {
              $and: [
                { $gte: ["$date", dayjs().subtract(90, 'd').toDate()] },
                { $lt: ["$date", dayjs().toDate()] }
              ]
            },
            '$quantity',
            0
          ]
        }
      },
      // 可扩展其他时间段统计,比如近30天
      thirtyDays: {
        $sum: {
          $cond: [
            {
              $and: [
                { $gte: ["$date", dayjs().subtract(30, 'd').toDate()] },
                { $lt: ["$date", dayjs().toDate()] }
              ]
            },
            '$quantity',
            0
          ]
        }
      }
    }
  }
])

内容的提问来源于stack exchange,提问作者Jonathan Zier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:24:03