Mongoose Query Builder. Или не возвращает ожидаемых результатов

1

контекст
Я создаю запрос, когда пользователь может ввести ряд дат для поиска документов "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);
}

Скриншоты
Когда указаны даты запроса: Изображение 174551
Результаты:
Изображение 174551

Когда указывается только одна дата запроса: Изображение 174551
Результаты:
Изображение 174551

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

  • 0
    Вам нужно 2 условия в конце запроса. Я добавляю как ответ.
Теги:
mongoose
query-builder
or-operator

1 ответ

1
Лучший ответ
if(req.body.endDate) {
    queryArray.push({playerStartDtm: {$lt: 
    moment(req.body.endDate).endOf('day').toDate()}});
}

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

 ({ playerStartDtm : { $gt :  expression, $lt : expression}})
  • 0
    Я хочу, чтобы запрос возвращал любые документы, которые перекрывают даты. Корректировка, которую вы внесли выше, исключает игроков, которые начинаются до даты начала, но заканчиваются после нее. Вот почему у меня есть отдельная проверка на дату окончания. Вы говорите, что мне нужно включить оба выражения: $ gt и $ lt, когда я запрашиваю даты?
  • 0
    Да. И $ gt, и выражение $ lt при запросе по датам. Потому что вы ищете диапазон дат.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню