#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.