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

如何按小时聚合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:51:01