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
相关产品推荐
相关产品推荐

