MongoDB聚合按context分组统计时段数据计数返回0/1问题
错误原因
统计结果只返回0或1的核心问题是:你把lesser_12h、lesser_24h两个累加统计字段写进了$group的_id分组键里。$group阶段会按_id内所有字段的值组合做拆分,你把计数逻辑放在分组键中,相当于每条记录只要满足/不满足时间条件就会单独成组,单组内最多只有1条记录,累加结果自然只能是0或1。
修复方案
把两个累加统计字段从_id对象中移出来,作为$group阶段和_id平级的统计属性即可;如果要完全匹配你给出的返回格式,最后追加一个$project阶段调整字段名、过滤多余字段即可。
修正后的完整聚合代码如下:
const aggregation = [ { $match: { EVENTTIME: { $gte: startDate } } }, { $group: { _id: '$CONTEXT', // 分组键仅保留CONTEXT字段 lesser_12h: { $sum: { $cond: [ { $lte: [{ $subtract: [ '$EVENTTIME', startDate ] }, 12 * 60 * 60 * 1000] }, 1, 0 ] } }, lesser_24h: { $sum: { $cond: [ { $lte: [{ $subtract: [ '$EVENTTIME', startDate ] }, 24 * 60 * 60 * 1000] }, 1, 0 ] } } } }, { $project: { _id: 0, context: '$_id', lesser_12h: 1, lesser_24: '$lesser_24h' // 对齐期望返回的字段名 } } ];
补充说明
- 代码里用
12 * 60 * 60 * 1000、24 * 60 * 60 * 1000代替硬编码的毫秒数值,后续维护时不需要手动换算时间,可读性更高 - 最后的
$project阶段仅用于对齐你给出的期望返回结构,如果不需要严格匹配字段名,可以直接删除该阶段。
内容的提问来源于stack exchange,提问作者Greggz
相关产品推荐
相关产品推荐

