Mongodb中的过滤时间范围
Posted
技术标签:
【中文标题】Mongodb中的过滤时间范围【英文标题】:Filter time range in Mongodb 【发布时间】:2021-04-20 10:39:24 【问题描述】:我想获取 MongoDB 中特定 TIME 内的所有文档。我已经搜索过这个,但我只能找到属于特定DATE的文档的解决方案。
例如,我要查找的 SQL 表达式是:WHERE YEAR(date_time) = 2019 AND TIME(date_time) BETWEEN '07:30' AND '08:30'
【问题讨论】:
【参考方案1】:演示 - https://mongoplayground.net/p/Ny5FCEiQkE7
使用$expr
db.collection.aggregate([
$match:
$expr: $eq: [ $year: "$dt" , 2021 ] , // match year
$or: [ // or query
$and: [ // match hour 7 and minutes 30+
$expr: $eq: [ "$hour": "$dt" , 7 ] ,
$expr: $gte: [ "$minute": "$dt" , 30 ]
]
,
$and: [ // match hour 8 and minutes less than 30
$expr: $eq: [ "$hour": "$dt" , 8 ] ,
$expr: $lt: [ "$minute": "$dt" , 30 ]
]
,
]
])
【讨论】:
【参考方案2】:你可以用这个:
db.collection.aggregate([
$addFields:
parts:
$dateToParts:
date: "$date_time" // , timezone : <timezone> if needed
,
$set: "parts.time": $sum: [ $multiply: ["$parts.hour", 24] , "$parts.minute"] ,
$match:
"parts.year": 2019,
"parts.time":
$gte: $sum: [ $multiply: [7, 24] , 30] ,
$lte: $sum: [ $multiply: [8, 24] , 30]
])
另一个解决方案可能是这个:
db.collection.aggregate([
$addFields:
time:
$dateFromParts:
year: $year: "$date_time" , month: 1, day: 1,
hour: $hour: "$date_time" , minute: $minute: "$date_time"
// , timezone : <timezone> if needed
,
$match:
time:
$gte: ISODate("2019-01-01T07:30:00Z"),
$lte: ISODate("2019-01-01T08:30:00Z")
])
【讨论】:
以上是关于Mongodb中的过滤时间范围的主要内容,如果未能解决你的问题,请参考以下文章
Mongodb:从 mongo shell 中的 ObjectId 执行日期范围查询
在spring mongodb中的两个字符串日期范围之间查找