контекст
Я создаю запрос, когда пользователь может ввести ряд дат для поиска документов "Player". Запрос должен возвращать всех игроков, чьи начальные и конечные даты совпадают с запрошенными датами. Я делаю это, используя условие ИЛИ, где либо дата окончания игрока после даты начала запроса, либо дата начала воспроизведения игрока до даты окончания запроса. Обе даты в запросе являются необязательными, позволяя пользователю указывать только дату окончания или дату начала или не возвращать все соответствующие документы.
проблема
Запрос работает, когда указывается только одна из двух дат запроса (см. Скриншоты ниже). Тем не менее, он возвращает все документы, если указаны обе даты (функционально игнорируя оба параметра запроса).
Код
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);
}
Скриншоты
Когда указаны даты запроса:
Результаты:
Когда указывается только одна дата запроса:
Результаты:
Может ли кто-нибудь помочь мне определить, что я делаю неправильно? Спасибо!
if(req.body.endDate) {
queryArray.push({playerStartDtm: {$lt:
moment(req.body.endDate).endOf('day').toDate()}});
}
В вышеприведенном запросе вы проверяете меньше даты окончания. Вам нужно проверить диапазон между датами:
({ playerStartDtm : { $gt : expression, $lt : expression}})