mongodb查找日期范围内但一天中特定时间的值

时间:2020-03-15 13:26:56

标签: javascript mongodb mongoose

我有一个非常简单的mongodb数据库,其中有两个重要字段:

datevalue

我有以下代码来获取特定日期范围内的读数。此查询在节点中使用猫鼬:

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')

2 个答案:

答案 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返回的值介于023之间,因此将为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。