我在 MongoDB 中有一个具有以下结构的集合:
{
"Name": "Test",
"StartDatetime": ISODate('2024-05-15T15:00:41.180+00:00'),
"EndDatetime": ISODate('2024-05-15T15:30:12.120+00:00')
}
我在此集合中有许多具有不同日期时间的记录,并且我想仅根据时间过滤它们,而忽略日期。例如,我想检索时间在 02:32:05 到 05:23:12 之间的所有文档。
我写了这个查询:
db.collection.find({
$expr: {
$and: [
{
$or: [
{
$gte: [
{
$concat: [
{ $substr: [{ $hour: "$StartDateTime" }, 0, 2] },
":",
{ $substr: [{ $minute: "$StartDateTime" }, 0, 2] },
":",
{ $substr: [{ $second: "$StartDateTime" }, 0, 2] }
]
},
"02:32:05"
]
},
{
$and: [
{ $eq: [{ $hour: "$StartDateTime" }, 2] },
{ $gte: [{ $concat: [{ $substr: [{ $minute: "$StartDateTime" }, 0, 2] }, ":", { $substr: [{ $second: "$StartDateTime" }, 0, 2] }] }, "32:05"] }
]
}
]
},
{
$or: [
{
$lte: [
{
$concat: [
{ $substr: [{ $hour: "$EndDateTime" }, 0, 2] },
":",
{ $substr: [{ $minute: "$EndDateTime" }, 0, 2] },
":",
{ $substr: [{ $second: "$EndDateTime" }, 0, 2] }
]
},
"05:23:12"
]
},
{
$and: [
{ $eq: [{ $hour: "$EndDateTime" }, 5] },
{ $lte: [{ $concat: [{ $substr: [{ $minute: "$EndDateTime" }, 0, 2] }, ":", { $substr: [{ $second: "$EndDateTime" }, 0, 2] }] }, "23:12"] }
]
}
]
}
]
}
})
但是,我相信可能有更好的方法来编写这个查询。我在网上搜索过,但我只找到了关于如何仅根据日期创建查询的答案。
$dateToString
将日期字段转换为与您的输入日期格式匹配的字符串(即
%H:%m:%S
)。然后,对字符串进行字符串比较。
db.collection.aggregate([
{
"$match": {
"$expr": {
"$and": [
{
"$gte": [
{
"$dateToString": {
"date": "$StartDatetime",
"format": "%H:%m:%S"
}
},
"02:32:05"// your start date input here
]
},
{
"$lt": [
{
"$dateToString": {
"date": "$EndDatetime",
"format": "%H:%m:%S"
}
},
"05:23:12"// your end date input here
]
}
]
}
}
}
])