Агрегация Mongodb, сравнивающая даты ISO, не возвращает документов

#mongodb #mongoose #aggregation-framework #isodate

#mongodb #mongoose #агрегация-фреймворк #isodate

Вопрос:

Мой $ lte (body.to ) дата: 2019-04-24T15:42:16.472Z Мой $ gte (body.from) дата: 2019-03-25T15:42:16.472Z

Моя стадия сопоставления агрегации:

   {
      $match: {
        'workflow.site.completedAt': {
          $exists: true
          // $lte: body.from
          // $gte: body.to
        }
      }
    },
  

если у меня есть только то, что существует там, я получаю:

 [ { _id: null, date: 2019-04-16T14:56:36.738Z, count: 8450 } ]
  

Я группирую с помощью $last объект last date, и именно так дата форматируется в БД. Таким образом, данные, хранящиеся в БД, используют $date, а затем формат строки ISO.

Запуск этапа сопоставления в любой комбинации, даже если сегодня включен LTE, я не могу сопоставить / найти какие-либо документы.

Данные в фактической базе данных:

  "completedAt": {
                    "$date": "2018-09-19T14:45:29.419Z"
                },
  

Комментарии:

1. Вы уверены, что оба body.from и date из ваших документов имеют одинаковый тип ISODate?

2. @mickl Я совсем не уверен — вот почему я зарегистрировал их на консоли и разместил их здесь вверху; Судя по их структуре — они, похоже, совпадают с тем, что есть в базе данных (также размещено здесь)

3. Дело в том, что MongoDB проверяет типы перед проверкой значений, поэтому я полагаю, что вы можете сравнивать строку с ISODate, но это всего лишь предположение

4. @mickl но разве формат ISO по умолчанию не является строкой? даже функция для преобразования из объекта Date (который является типом object) приведет к строке. Просто поиграл с типами, и это действительно строка.

5. @mickl Ваше упоминание о строке направило меня в правильном направлении, и мне удается заставить все это работать, я обновлю свой пост с решением завтра, но, короче говоря, mongoose уже выполняет преобразование в ISODate («string date stuff»), и мне нужно было только передать фактический объект Date. Итак, я просто объявил const from = new Date(body.from); и передал from.