MongoDB中10:00-11:00时段数据聚合遗漏数据的解决方法
解决方案
要将11:00的文档归入10点时段的聚合结果,核心是调整日期分组逻辑:把整点(分钟为0)的文档归属到前一个小时,并将其分钟显示为59。以下是修改后的聚合查询:
完整聚合管道
[ { "$project": { "energy": 1, "adjustedData": { "$let": { "vars": { "parts": { "$dateToParts": { "date": "$timestamp" } } }, "in": { "year": "$$parts.year", "month": "$$parts.month", "day": "$$parts.day", "hour": { "$cond": { "if": { "$eq": [ "$$parts.minute", 0 ] }, "then": { "$subtract": [ "$$parts.hour", 1 ] }, "else": "$$parts.hour" } }, "minute": { "$cond": { "if": { "$eq": [ "$$parts.minute", 0 ] }, "then": 59, "else": "$$parts.minute" } } } } } } }, { "$group": { "_id": { "year": "$adjustedData.year", "month": "$adjustedData.month", "day": "$adjustedData.day", "hour": "$adjustedData.hour" }, "activeEnergy": { "$push": { "minute": "$adjustedData.minute", "energy": "$energy" } } } } ]
逻辑说明
- 日期调整处理:
- 用
$let将$dateToParts解析的日期部分存为变量,避免重复计算 - 通过
$cond判断:若文档分钟数为0(如11:00),则将小时减1(11→10),同时把分钟设为59;非整点文档保持原小时和分钟不变
- 用
- 分组聚合:
- 基于调整后的年、月、日、小时分组,确保11:00的文档被归入10点时段
- 将调整后的分钟和对应energy值推入
activeEnergy数组
输出结果
执行查询后将得到期望结果:
{ "_id": { "year": 2023, "month": 5, "day": 15, "hour": 10 }, "activeEnergy": [ { "minute": 0, "energy": 2333 }, { "minute": 10, "energy": 2340 }, { "minute": 30, "energy": 2349 }, { "minute": 40, "energy": 2355 }, { "minute": 50, "energy": 2360 }, { "minute": 59, "energy": 2370 } ] }
内容的提问来源于stack exchange,提问作者muni
相关产品推荐
相关产品推荐

