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