Запрос MongoCollection для данных между двумя строками даты

Я пытаюсь создать запрос для поиска всех коллекций, находящихся между двумя строками даты, однако все мои попытки не увенчались успехом, и каждый раз, когда я пытаюсь выполнить запрос, он всегда не возвращает никаких результатов.

это запрос, который я использую:

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
}

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

Имена полей в вашем запросе не совпадают с именами полей в отображаемом элементе данных.

Burak Serdar 23.05.2024 23:00

разве вам не следует использовать всего $and для получения записей за 2 дня mongoplayground.net/p/6pmHZrDY6Vd. 2. Данные вашего примера имеют разные имена полей? 3. Сохраняете ли вы даты в виде строки на стороне монго, если да, можете ли вы попробовать без новой части даты?

cmgchess 23.05.2024 23:01

Никогда не следует хранить значения даты в виде строки, это недостаток дизайна. Сохраняйте правильные объекты Date, тогда ваш запрос будет работать и вы избежите многих других проблем.

Wernfried Domscheit 24.05.2024 10:48
Поведение ключевого слова "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
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Некоторые проблемы с вашими данными и запросом:

  1. В вашем запросе есть слова initial и end, но в вашем документе БД есть llegada и salida.

  2. В ваших документах даты представлены в виде строк, а не в виде объектов даты. И вы сравниваете объекты Date, а не строки.

    • Так что либо сделайте это как сравнение строк (не рекомендуется), либо преобразуйте llegada и salida в даты, используя $dateFromString.
    • Если вы всегда будете использовать только UTC для всех переменных даты и все ваши документы имеют строки дат, которые представляют UTC, вы можете сделать это как сравнение строк.
    • Но если может использоваться несколько часовых поясов, преобразуйте их с помощью $dateFromString во время запроса.
  3. Нет необходимости использовать $and, если внутри него всего одно $or предложение.

  4. Как прокомментировал 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?

Arturo Martinez 24.05.2024 02:35

У меня странное поведение: независимо от того, какую дату я передаю в запрос, он всегда возвращает документ, даже если он не находится в диапазоне. Я проверил некоторые даты для $llegada и $salida, и он всегда возвращает документ.

Arturo Martinez 24.05.2024 04:09

теперь все заработало, заменив $or на $and

Arturo Martinez 24.05.2024 04:13

1. Что касается «нужно ли использовать $expr, чтобы иметь возможность выполнять $dateFromString?» При выполнении простого field: {$gte: some_value} это не требуется, но использовать $dateFromString мы не можем {$dateFromString: {dateString: "$field" } }: {$gte: some_value}. Кроме того, чтобы получить доступ к полю из документа и использовать «выражения агрегирования», такие как $dateFromString, нам нужно использовать $expr. 2. Да, использование $or и $and вызвало некоторую обеспокоенность в комментариях к вопросу, о которых я говорил в № 4.

aneroid 24.05.2024 12:09

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