Node.js / MongoDB - запрос даты - PullRequest
       6

Node.js / MongoDB - запрос даты

0 голосов
/ 06 января 2019

У меня возникли проблемы с пониманием того, как запрашивать даты; Я думаю, что проблема может быть в том, как мои данные структурированы. Вот образец документа в моей базе данных.

{

    "phone_num": 12553,
    "facilities": [
        "flat-screen",
        "parking"
    ],
    "surroundings": [
        "ping-pong",
        "pool"
    ],
    "rooms": [
        {
            "room_name": "Standard Suite",
            "capacity": 2,
            "bed_num": 1,
            "price": 50,
            "floor": 1,
            "reservations": [
                {
                    "checkIn": {
                        "$date": "2019-01-10T23:23:50.000Z"
                    },
                    "checkOut": {
                        "$date": "2019-01-20T23:23:50.000Z"
                    }
                }
            ]
        }
    ]
}

Я пытаюсь запросить даты, чтобы проверить, доступна ли определенная комната в определенном диапазоне дат, но, независимо от того, что я делаю, я не могу получить правильный результат, либо мой запрос 404, либо пустой результат массив.

Я действительно все перепробовал, сейчас для простоты я просто пытаюсь заставить запрос работать с checkIn, чтобы я мог понять, что я делаю неправильно. Я попробовал 100 вариантов кода ниже, но не смог заставить его работать вообще.

  .find({"rooms": { "reservations": {   "checkIn" : {"$gte": { "$date": "2019-01-09T00:00:00.000Z"}}}}})

Я неправильно понимаю, как работает метод .find, или что-то не так с тем, как я храню свои даты? (Я продолжаю видеть людей, упоминающих ISODate, но не слишком уверен, что это такое или как реализовать).

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

var mydate1 = new Date ();

var mydate1 = new Date (). GetTime ();

ObjectId.getTimestamp ()

Returns the timestamp portion of the ObjectId() as a Date.

Пример

В следующем примере вызывается метод getTimestamp () для ObjectId ():

ObjectId ( "507c7f79bcf86cd7994f6c0e"). GetTimestamp ()

Это вернет следующий вывод:

ISODate ( "2012-10-15T21: 26: 17Z")

0 голосов
/ 06 января 2019

Я думаю, что вы разместили неверный запрос. Например, если вы хотите запросить номера с временем регистрации в определенном диапазоне, запрос должен выглядеть следующим образом -

.find({"rooms.reservations.checkout":{$gte:new Date("2019-01-06T13:11:50+06:00"), $lt:new Date("2019-01-06T14:12:50+06:00")}})

Теперь вы можете сделать то же самое со временем оформления заказа, чтобы получить надлежащую фильтрацию для поиска номеров, доступных в пределах диапазона дат.

Хотя совет, способ, которым вы создали свою коллекцию, не является устойчивым в долгосрочной перспективе. Например, запрос даты, который вы пытаетесь выполнить, даст вам правильные документы, но не комнаты внутри каждого документа, которые соответствуют вашему диапазону дат. Вам придется сделать это самостоятельно на стороне сервера (при условии, что вы не используете агрегацию). Это заблокирует ваш сервер от обработки других ожидающих запросов, что нежелательно. Я предлагаю вам разбить коллекцию и иметь комнат и бронирований в отдельных коллекциях для упрощения запросов.

...