如何仅根据 MongoDB 中的时间过滤 ISODate 字段

问题描述 投票:0回答:1

我在 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"] } ] } ] } ] } })
但是,我相信可能有更好的方法来编写这个查询。我在网上搜索过,但我只找到了关于

如何仅根据日期创建查询的答案。

mongodb mongodb-query aggregation-framework
1个回答
0
投票
目前,尚不清楚您的示例中提供的日期比较逻辑。然而,我们的想法是使用

$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 ] } ] } } } ])

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.