Mongoose Query Builder. Или не возвращает ожидаемых результатов - PullRequest
0 голосов
/ 26 октября 2018

Контекст
Я создаю запрос, в котором пользователь может ввести диапазон дат для поиска документов «Игрок». Запрос должен возвращать любых игроков, чьи даты начала и окончания перекрываются с запрошенными датами. Я делаю это, используя условие ИЛИ, когда либо дата окончания игрока находится после даты начала запроса, либо дата начала игрока предшествует дате окончания запроса. Обе даты в запросе являются необязательными, что позволяет пользователю указывать только дату окончания или дату начала или не возвращать все соответствующие документы.

Задача
Запрос работает, когда указана только одна из двух дат запроса (см. Скриншоты ниже). Однако он возвращает все документы, если указаны обе даты (функционально игнорируя оба параметра запроса).

Код

let query = Player.find({'casino': user.casino});
let queryArray = [];
if(req.body.startDate) {
        queryArray.push({playerEndDtm: {$gt: moment(req.body.startDate).toDate()}});
}
if(req.body.endDate) {
    queryArray.push({playerStartDtm: {$lt: moment(req.body.endDate).endOf('day').toDate()}});
}
if(queryArray.length > 0) {
    query.or(queryArray);
}

Скриншоты
Когда указаны обе даты запроса: enter image description here
Результаты:
enter image description here

Если указана только 1 дата запроса: enter image description here
Результаты:
enter image description here

Может кто-нибудь помочь мне определить, что я делаю не так? Спасибо!

1 Ответ

0 голосов
/ 26 октября 2018
if(req.body.endDate) {
    queryArray.push({playerStartDtm: {$lt: 
    moment(req.body.endDate).endOf('day').toDate()}});
}

В приведенном выше запросе вы просто проверяете меньше даты окончания. Вам необходимо проверить диапазон дат:

 ({ playerStartDtm : { $gt :  expression, $lt : expression}})
...