过滤时间范围 Mongodb
Filter time range in Mongodb
我想获取 MongoDB 中特定 TIME 内的所有文档。我搜索过这个,但我只能找到属于特定 DATE.
的文档的解决方案
例如,我要查找的 SQL 表达式为:WHERE YEAR(date_time) = 2019 AND TIME(date_time) BETWEEN '07:30' AND '08:30'
演示 - 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 ] } }
]
},
]
}
}])
你可以使用这个:
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 中特定 TIME 内的所有文档。我搜索过这个,但我只能找到属于特定 DATE.
的文档的解决方案例如,我要查找的 SQL 表达式为:WHERE YEAR(date_time) = 2019 AND TIME(date_time) BETWEEN '07:30' AND '08:30'
演示 - 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 ] } }
]
},
]
}
}])
你可以使用这个:
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")
}
}
}
])