Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB 按特定小时查询记录:使用 $hour 操作符

本文演示如何使用 Aggregation Framework 中的 $hour 操作符从 DateTime 字段提取小时,并按特定小时(如 1 点、8 点)过滤记录。

创建示例数据(包含 OrderDatetime 字段)

> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-01-31 09:45:50")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6e8a86d78f205348bc62a") }
> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-02-21 01:10:01")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6e8b86d78f205348bc62b") }
> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-04-01 04:10:11")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6e8e26d78f205348bc62c") }
> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-05-11 08:53:01")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6e8f26d78f205348bc62d") }

显示所有数据

> db.mongoDbSearchForHoursDemo.find().pretty();
{ "_id" : ObjectId("5cd6e8a86d78f205348bc62a"), "CustomerName" : "Larry", "OrderDatetime" : ISODate("2019-01-31T09:45:50Z") }
{ "_id" : ObjectId("5cd6e8b86d78f205348bc62b"), "CustomerName" : "Larry", "OrderDatetime" : ISODate("2019-02-21T01:10:01Z") }
{ "_id" : ObjectId("5cd6e8e26d78f205348bc62c"), "CustomerName" : "Larry", "OrderDatetime" : ISODate("2019-04-01T04:10:11Z") }
{ "_id" : ObjectId("5cd6e8f26d78f205348bc62d"), "CustomerName" : "Larry", "OrderDatetime" : ISODate("2019-05-11T08:53:01Z") }

Aggregation 查询:提取小时并筛选 1 点和 8 点的记录

> db.mongoDbSearchForHoursDemo.aggregate([
  { $project: { SpecificHours: { $hour: "$OrderDatetime" } } },
  { $match: { SpecificHours: { "$in": [8, 1] } } }
]);

结果

{ "_id" : ObjectId("5cd6e8b86d78f205348bc62b"), "SpecificHours" : 1 }
{ "_id" : ObjectId("5cd6e8f26d78f205348bc62d"), "SpecificHours" : 8 }

日期时间操作符完整列表

进阶:按小时分组统计

db.orders.aggregate([
  { $project: { hour: { $hour: "$createdAt" } } },
  { $group: { _id: "$hour", count: { $sum: 1 }, totalAmount: { $sum: "$amount" } } },
  { $sort: { _id: 1 } }
]);

时区注意事项

  • MongoDB 存储 UTC 时间,$hour 返回 UTC 小时
  • 如需按本地时间查询,需在存储时转换或使用 $dateToString 指定时区 (MongoDB 3.6+)
  • 示例:{ $hour: { date: "$OrderDatetime", timezone: "+08:00" } }
Operator返回值范围/示例
$year年份2019
$month月份1-12
$dayOfMonth日期1-31
$hour小时0-23
$minute分钟0-59
$second秒0-59
$millisecond毫秒0-999
$dayOfWeek星期1(周日)-7(周六)
$dayOfYear一年中的第几天1-366
$week一年中的第几周0-53
$isoDayOfWeekISO 星期1(周一)-7(周日)
$isoWeekISO 周1-53