本文演示如何使用 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 }
日期时间操作符完整列表
| 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 |
$isoDayOfWeek | ISO 星期 | 1(周一)-7(周日) |
$isoWeek | ISO 周 | 1-53 |