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

如何在MongoDB中按小时提取指定日期的数据?

MongoDB 提取指定日期数据并按小时分组

没问题,我来帮你搞定这个需求!针对你给出的文档结构(date字段是ISODate类型),我们可以用MongoDB的聚合框架来实现提取指定日期数据并按小时分组统计的操作,具体步骤和代码如下:

完整聚合查询示例

假设我们要提取2018-03-22这一天的数据,并按小时统计每个时段的文档数量,查询语句如下:

db.collection.aggregate([
  // 第一步:筛选出指定日期的所有数据
  {
    $match: {
      date: {
        $gte: ISODate("2018-03-22T00:00:00.000Z"),
        $lt: ISODate("2018-03-23T00:00:00.000Z")
      }
    }
  },
  // 第二步:按小时分组,统计每个小时的文档数
  {
    $group: {
      _id: {
        year: { $year: "$date" },
        month: { $month: "$date" },
        day: { $dayOfMonth: "$date" },
        hour: { $hour: "$date" }
      },
      count: { $sum: 1 }
    }
  },
  // 可选:按小时排序,让结果更直观
  {
    $sort: { "_id.hour": 1 }
  }
])

各阶段说明

  • $match阶段:这里用$gte(大于等于)和$lt(小于)来精准锁定目标日期的全天数据,避免直接用$eq导致的时分秒匹配问题(毕竟ISODate包含具体时间点,没法直接等于某一天)。
  • $group阶段:通过$year、$month、$dayOfMonth确保我们是在同一天内按小时分组,$hour会提取date字段的小时部分,最后用$sum:1统计每个小时的文档总数。
  • $sort阶段:这是可选步骤,把结果按小时从小到大排序,方便你按时间顺序查看数据分布。

简化分组ID的写法

如果你觉得分组的_id太繁琐,也可以用$dateToString直接格式化成可读性更强的字符串,比如:

{
  $group: {
    _id: { $dateToString: { format: "%Y-%m-%d %H", date: "$date" } },
    count: { $sum: 1 }
  }
}

这样分组后的_id会是类似"2018-03-22 13"的格式,看起来更直观。

针对你给出的示例数据的结果

运行上述查询后,你提供的示例数据返回结果会是:

{ "_id" : { "year" : 2018, "month" : 3, "day" : 22, "hour" : 13 }, "count" : 3 }

(因为示例中2018-03-22的3条数据都集中在13点)

内容的提问来源于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.21 04:26:47