我有一个非常简单的mongodb数据库,其中有两个重要字段:
date
和value
我有以下代码来获取特定日期范围内的读数。此查询在节点中使用猫鼬:
Reading.find({
date: {
$gte: startDate,
$lte: endDate
}
}).select('value date')
但是,我需要在一天的特定时间获取读数。我可以在应用程序的前端执行此操作,但我相信在数据库级别执行此操作可能会更快。
我该怎么做?
Reading.find({
date: {
$gte: startDate,
$lte: endDate
},
$hour: {
$gte: 18,
$lte: 24
}
}).select('value date')
答案 0 :(得分:2)
您需要the documentation才能使用$hour
,请尝试:
Reading.find({
$expr: {
$and: [
{ $gte: [ "$date", startDate ] },
{ $lte: [ "$date", endDate ] },
{ $gte: [ { $hour: { $toDate: "$date" } }, 18 ] },
{ $lte: [ { $hour: { $toDate: "$date" } }, 23 ] }
]
}
}).select('value date')
请注意,$expr返回的值介于0
和23
之间,因此将为23
返回23:59
答案 1 :(得分:1)
实际上,如果您在startDate和endDate日期变量中包含时间信息,则您的第一个查询必须可以工作。
您可以在查询之前为这些变量设置小时数,它应该可以工作。
let startDate = new Date(2020, 2, 15); //months between 0-11, so 2 means March
let endDate = new Date(2020, 2, 15);
startDate.setHours(20);
endDate.setHours(24);
const result = await Reading.find({
date: {
$gte: startDate,
$lte: endDate
}
}).select("value date");
示例文档:
{
"_id" : ObjectId("5e6e37d0b530b737e04ba937"),
"date" : ISODate("2020-03-15T23:11:56.443+03:00"),
"value" : "value4"
},
{
"_id" : ObjectId("5e6e33b7be142a2bf0c8f75c"),
"date" : ISODate("2020-03-15T21:54:15.823+03:00"),
"value" : "value3"
},
{
"_id" : ObjectId("5e6e33b4be142a2bf0c8f75b"),
"date" : ISODate("2020-03-15T19:54:15.823+03:00"),
"value" : "value2"
},
{
"_id" : ObjectId("5e6e33b1be142a2bf0c8f75a"),
"date" : ISODate("2020-03-15T17:54:15.823+03:00"),
"value" : "value1"
}
输出:
[
{
"date": "2020-03-15T18:54:15.823Z",
"_id": "5e6e33b7be142a2bf0c8f75c",
"value": "value3"
},
{
"date": "2020-03-15T20:11:56.443Z",
"_id": "5e6e37d0b530b737e04ba937",
"value": "value4"
}
]
我有+3个时区,所以18:54实际上是21:54,而20:11是23:11。