如何在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
相关产品推荐
相关产品推荐

