Построитель запросов Mongoose .или не возвращает ожидаемые результаты

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

Скриншоты
Если указаны обе даты запроса: Построитель запросов Mongoose .или не возвращает ожидаемые результаты
Результатов:
Построитель запросов Mongoose .или не возвращает ожидаемые результаты

Когда указана только 1 дата запроса: Построитель запросов Mongoose .или не возвращает ожидаемые результаты
Результатов:
Построитель запросов Mongoose .или не возвращает ожидаемые результаты

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

В запросе endate вам нужно 2 условия. Добавляю в качестве ответа.

Ved 26.10.2018 21:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
if (req.body.endDate) {
    queryArray.push({playerStartDtm: {$lt: 
    moment(req.body.endDate).endOf('day').toDate()}});
}

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

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

Я хочу, чтобы запрос возвращал любые документы, которые совпадают по датам. Внесенная вами выше корректировка исключает игроков, которые начинают игру до даты начала, но заканчивают после нее. Вот почему у меня есть отдельный чек на дату окончания. Вы хотите сказать, что мне нужно включать и выражение $ gt, и выражение $ lt, когда я запрашиваю даты?

Evan Kleiner 26.10.2018 21:24

да. И $ gt, и выражение $ lt при запросе по датам. Потому что вы ищете диапазон дат.

Ved 26.10.2018 21:29

Спасибо. Но это все еще не объясняет, почему это работает, когда я ввожу только одну дату. Есть мысли по этому поводу?

Evan Kleiner 26.10.2018 21:31

Когда вы запрашиваете дату окончания, это выбирается дата без учета даты начала. Вы должны искать дату окончания после даты начала. Т.е. дата окончания всегда больше даты начала. Когда вы вводите одну дату, ваш запрос работает, потому что нет границы даты.

Ved 26.10.2018 21:35

Боже мой, ты прав. Спасибо, что нашли время помочь мне понять.

Evan Kleiner 26.10.2018 21:55

Другие вопросы по теме