如何按小时聚合MongoDB文档统计过去24小时每小时文件上传数量
MongoDB 5.0+ 按小时统计24小时文件上传量实现方案
核心聚合查询(可直接获取有上传记录的小时统计)
db.files.aggregate([ // 过滤过去24小时的上传记录 { $match: { timestamp: { $gte: new Date(Date.now() - 24 * 60 * 60 * 1000) } } }, // 按整点小时分组统计数量 { $group: { _id: { $dateTrunc: { date: "$timestamp", unit: "hour", timezone: "Asia/Shanghai" // 替换为实际业务时区,UTC标准则填"UTC" } }, count: { $sum: 1 } } }, // 按时间升序排序 { $sort: { _id: 1 } }, // 格式化输出字段 { $project: { _id: 0, hour: "$_id", uploadCount: "$count" } } ])
输出样例
[ { "hour": ISODate("2024-05-20T13:00:00.000Z"), "uploadCount": 3 }, { "hour": ISODate("2024-05-20T14:00:00.000Z"), "uploadCount": 2 } ]
无上传记录小时补0方案
上述查询只会返回有上传记录的小时,如需展示24小时内所有时段、无上传则显示计数0,可根据数据库版本选择实现方式:
- 方案1:升级到MongoDB 5.1及以上版本,在
$group和$sort阶段之间插入如下聚合阶段,服务端自动补全缺失时段{ $densify: { field: "_id", range: { step: 1, unit: "hour", bounds: [new Date(Date.now() - 24 * 60 * 60 * 1000), new Date()] } } }, { $set: { count: { $ifNull: ["$count", 0] } } } - 方案2:MongoDB 5.0版本无需升级,在业务代码中生成过去24小时的所有整点时间列表,和查询结果合并,未匹配到的记录默认赋值
uploadCount: 0即可。
注意事项
$dateTrunc是MongoDB 5.0新增的日期运算符,可直接将日期截断到指定时间单位的起点,相比旧版本手动拼接日期字段的实现更简洁,不易出现时区偏差- 时区参数需和
timestamp字段存储的时间标准保持一致,避免统计结果出错
内容的提问来源于stack exchange,提问作者amazingdoodler
相关产品推荐
相关产品推荐

