You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:06