MongoDB - запрос доступного диапазона дат с диапазоном дат для отеля

У меня есть массив объектов, содержащих даты, когда отель доступен для бронирования в Mongo. Это выглядит примерно так, используя форматы даты ISO, указанные здесь.

Вот как выглядит документ, вкратце для примера.

available: [
    {
        "start":"2014-04-07T00:00:00.000000",
        "end":"2014-04-08T00:00:00.000000"
    },
    {
        "start":"2014-04-12T00:00:00.000000",
        "end":"2014-04-15T00:00:00.000000"
    },  
    {
        "start":"2014-04-17T00:00:00.000000",
        "end":"2014-04-22T00:00:00.000000"
    },
]

Теперь мне нужно запросить две даты, дату заезда и дату выезда. Если даты доступны, Mongo должен вернуть документ, в противном случае - нет. Вот несколько тестовых примеров:

6 апреля 2014 г. TO 8 апреля 2014 г. НЕ возвращаться.

13 апреля 2014 TO 16 апреля 2014 НЕ возвращаться.

17 апреля 2014 TO 21 апреля 2014 должен вернуться.

Как я могу сформировать это в запросе Mongo? Использование $ elemMatch выглядело как хорошее start, но я не знаю, где его взять после этого, поэтому все три примера, которые я опубликовал выше, работают с одним и тем же запросом. Любая помощь приветствуется.


person Dustin    schedule 04.04.2014    source источник


Ответы (2)


На самом деле я надеюсь, что в ваших документах есть настоящие ISODates, а не то, что кажется строками. Когда они это сделают, следующая форма запроса соответствует ожидаемому:

db.collection.find({ 
    "available": {
        "$elemMatch": { 
            "start": { "$gte": new Date("2014-04-17") },
            "end":   { "$gte": new Date("2014-04-21") } 
        }
    }
})
person Neil Lunn    schedule 05.04.2014

db.collection.find({ 
    "available": {
        "$elemMatch": { 
            "start": { "$lte": new Date("2014-04-17") },
            "end":   { "$gte": new Date("2014-04-21") } 
        }
    }
})

Как насчет этой команды?

person dikesh    schedule 05.04.2014