mongodb находит значения в диапазоне дат, но для заданного c времени дня - PullRequest
1 голос
/ 15 марта 2020

У меня есть очень простая база данных mongodb, в которой есть два важных поля:

date и value

У меня есть следующий код для получения показаний с определенной даты c спектр. Этот запрос использует mon goose в узле:

Reading.find({
  date: {
    $gte: startDate,
    $lte: endDate
  }
}).select('value date')

Однако мне нужно получить показания в указанное c время суток. Я мог бы сделать это на внешнем интерфейсе своего приложения, но я полагаю, что на уровне базы данных это может быть быстрее.

Как мне сделать что-то подобное?

Reading.find({
  date: {
    $gte: startDate,
    $lte: endDate
  },
  $hour: {
    $gte: 18,
    $lte: 24
  }
}).select('value date')

Ответы [ 2 ]

2 голосов
/ 15 марта 2020

Вам нужно $ expr , чтобы использовать $hour, попробуйте:

Reading.find({
    $expr: {
        $and: [
            { $gte: [ "$date", startDate ] },
            { $lte: [ "$date", endDate ] },
            { $gte: [ { $hour: { $toDate: "$date" } }, 18 ] },
            { $lte: [ { $hour: { $toDate: "$date" } }, 23 ] }
        ]
    }
}).select('value date')

Обратите внимание, что $ hour возвращает значение от 0 до 23, поэтому 23 будет возвращено за 23:59

1 голос
/ 15 марта 2020

На самом деле ваш первый запрос должен работать, если вы включите информацию о времени в переменные даты 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...