如何统计MongoDB中当前小时和上一小时插入的文档数量
MongoDB统计当前/上一小时插入文档数方案
前置要求
- 集合内存在存储文档插入时间的
ISODate类型字段,示例中统一使用createTime作为字段名,实际使用时替换为你的业务字段即可 - 若集合未存储插入时间戳,MongoDB默认不保留文档插入时间,无法直接完成统计,建议新增文档时补充
createTime字段,写入时赋值为new Date()即可
方案1:直接区分当前/上一小时统计(兼容MongoDB 3.6+所有版本)
该方案直接返回标注为「当前小时」「上一小时」的统计结果,适配需求场景:
db.yourCollectionName.aggregate([ { $match: { createTime: { // 过滤出上一小时整点到当前时间的所有文档,缩小计算范围 $gte: new Date(new Date().setHours(new Date().getHours() - 1, 0, 0, 0)) } } }, { $project: { hourBucket: { $cond: { // 判断文档属于当前小时还是上一小时 if: { $gte: ["$createTime", new Date(new Date().setHours(new Date().getHours(), 0, 0, 0))] }, then: "当前小时", else: "上一小时" } } } }, { $group: { _id: "$hourBucket", documentCount: { $sum: 1 } } } ])
注意将代码中的yourCollectionName替换为你实际操作的集合名称
返回结果示例:
[ { "_id": "当前小时", "documentCount": 127 }, { "_id": "上一小时", "documentCount": 342 } ]
方案2:按自然小时分组统计(适合多小时批量统计场景)
如果后续需要扩展统计最近N小时每小时的文档数量,可以使用该方案,返回结果会附带具体的小时时间段:
db.yourCollectionName.aggregate([ { $match: { createTime: { // 调整setHours的第一个参数可以修改统计的时间范围,比如-24就是统计最近24小时 $gte: new Date(new Date().setHours(new Date().getHours() - 1, 0, 0, 0)) } } }, { $group: { _id: { $dateToString: { format: "%Y-%m-%d %H:00", date: "$createTime" } }, documentCount: { $sum: 1 } } }, { $sort: { _id: 1 } } ])
返回结果示例:
[ { "_id": "2024-05-20 14:00", "documentCount": 342 }, { "_id": "2024-05-20 15:00", "documentCount": 127 } ]
性能优化建议
- 大集合下务必给
createTime字段添加单字段索引,避免全表扫描导致查询超时 - 如果只需要统计数量不需要其他字段处理,可以在
$match阶段后添加$count阶段提前计算,进一步提升性能
内容的提问来源于stack exchange,提问作者Lucilfer
相关产品推荐
相关产品推荐

