Я пытаюсь создать запрос для поиска всех коллекций, находящихся между двумя строками даты, однако все мои попытки не увенчались успехом, и каждый раз, когда я пытаюсь выполнить запрос, он всегда не возвращает никаких результатов.
это запрос, который я использую:
const intialDate = new Date('2024-05-23T06:00:00.000Z');
const endDate = new Date('2024-05-24T20:44:02.172Z');
const dispoquery = this.guestModel.find({
$and: [
{
$or:[
{
initial: {
$gte: intialDate
}
},
{
end: {
$lte: endDate
}
},
]
}
]
}).catch((err) => {
return err;
})
.then((doc:any)=> {
return doc
})
Мне нужны все документы, соответствующие данному ассортименту:
intial >= intialDate || end <= endDate
Но у меня всегда нет результатов это пример данных моей коллекции:
{
"folio": "W1013",
"nombre": "CArlos",
"initial": "2024-05-23T06:00:00.000Z",
"end": "2024-05-24T19:52:11.050Z",
"__v": 0
}
Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?
разве вам не следует использовать всего $and для получения записей за 2 дня mongoplayground.net/p/6pmHZrDY6Vd. 2. Данные вашего примера имеют разные имена полей? 3. Сохраняете ли вы даты в виде строки на стороне монго, если да, можете ли вы попробовать без новой части даты?
Никогда не следует хранить значения даты в виде строки, это недостаток дизайна. Сохраняйте правильные объекты Date, тогда ваш запрос будет работать и вы избежите многих других проблем.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Некоторые проблемы с вашими данными и запросом:
В вашем запросе есть слова initial и end, но в вашем документе БД есть llegada и salida.
В ваших документах даты представлены в виде строк, а не в виде объектов даты. И вы сравниваете объекты Date, а не строки.
llegada и salida в даты, используя $dateFromString.$dateFromString во время запроса.Нет необходимости использовать $and, если внутри него всего одно $or предложение.
Как прокомментировал cmgchess, если вы ищете что-то между двумя датами, вам следует использовать только $and, а не $or.
Но ваш вопрос говорит
intial >= intialDate || end <= endDate
Поэтому я оставлю логику той же, что у вас уже есть. Но вам, вероятно, следует сделать
intial >= intialDate && end <= endDate
Поскольку во время запроса необходимо выполнить некоторые преобразования данных документа, вам нужно будет использовать $expr для сравнений/проверок.
db.guestModel.find({
$expr: {
$or: [
{
$gte: [
{ $dateFromString: { dateString: "$llegada" } },
intialDate
]
},
{
$lte: [
{ $dateFromString: { dateString: "$salida" } },
endDate
]
}
]
}
})
Спасибо за объяснение, все сработало, как и ожидалось! нужно ли использовать $expr, чтобы иметь возможность выполнять $dateFromString?
У меня странное поведение: независимо от того, какую дату я передаю в запрос, он всегда возвращает документ, даже если он не находится в диапазоне. Я проверил некоторые даты для $llegada и $salida, и он всегда возвращает документ.
теперь все заработало, заменив $or на $and
1. Что касается «нужно ли использовать $expr, чтобы иметь возможность выполнять $dateFromString?» При выполнении простого field: {$gte: some_value} это не требуется, но использовать $dateFromString мы не можем {$dateFromString: {dateString: "$field" } }: {$gte: some_value}. Кроме того, чтобы получить доступ к полю из документа и использовать «выражения агрегирования», такие как $dateFromString, нам нужно использовать $expr. 2. Да, использование $or и $and вызвало некоторую обеспокоенность в комментариях к вопросу, о которых я говорил в № 4.
Имена полей в вашем запросе не совпадают с именами полей в отображаемом элементе данных.