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

MongoDB如何按天、按小时分组统计访问数据以生成图表?

嘿,我来帮你搞定这个按小时统计访问量的MongoDB聚合查询问题!看你已经写了一部分代码,但还没完成,我给你两个可行的方案,适配不同的MongoDB版本,直接就能用来生成单日访问量图表:

先明确你的场景

你需要统计单日的访问量并按小时划分,你的MongoDB文档结构是这样的:

{ 
  "_id" : ObjectId("5ab1119b646e371568c8cf9e"), 
  "date" : ISODate("2018-03-20T13:46:30.018Z"), 
  "__v" : 0 
}

方案1:兼容MongoDB 3.6+(通用版)

这个方案不依赖新版本特性,适合大多数环境。我们通过提取日期的年、月、日、小时来分组,同时统计每组的访问次数:

db.getCollection('monitors').aggregate([
  // 可选:如果只需要统计特定某天的数据,加上这个过滤阶段
  {
    "$match": {
      "date": {
        "$gte": ISODate("2018-03-20T00:00:00Z"),
        "$lt": ISODate("2018-03-21T00:00:00Z")
      }
    }
  },
  // 按年、月、日、小时分组,统计访问量
  {
    "$group": {
      "_id": {
        "year": {"$year": "$date"},
        "month": {"$month": "$date"},
        "day": {"$dayOfMonth": "$date"},
        "hour": {"$hour": "$date"} // 提取小时字段,直接按整小时分组
      },
      "visitCount": {"$sum": 1} // 统计该小时的访问次数
    }
  },
  // 按时间顺序排序,方便后续生成图表
  {
    "$sort": {
      "_id.year": 1,
      "_id.month": 1,
      "_id.day": 1,
      "_id.hour": 1
    }
  }
])

方案2:MongoDB 5.0+ 简洁版

如果你用的是MongoDB 5.0及以上版本,推荐用$dateTrunc函数,它可以直接把日期截断到指定的时间单位(比如小时),代码更简洁:

db.getCollection('monitors').aggregate([
  // 可选:过滤特定日期的数据
  {
    "$match": {
      "date": {
        "$gte": ISODate("2018-03-20T00:00:00Z"),
        "$lt": ISODate("2018-03-21T00:00:00Z")
      }
    }
  },
  // 直接按小时截断日期并分组统计
  {
    "$group": {
      "_id": {"$dateTrunc": {date: "$date", unit: "hour"}},
      "visitCount": {"$sum": 1}
    }
  },
  // 按时间排序
  {
    "$sort": {"_id": 1}
  }
])

结果说明

这两个方案都会返回类似这样的结果:

  • 方案1返回:
    { "_id" : { "year" : 2018, "month" : 3, "day" : 20, "hour" : 13 }, "visitCount" : 5 }
    
  • 方案2返回:
    { "_id" : ISODate("2018-03-20T13:00:00Z"), "visitCount" : 5 }
    

这些数据可以直接用来生成按小时展示的访问量柱状图或折线图啦~

内容的提问来源于stack exchange,提问作者William.P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:28:41