MongoDB: есть ли другой способ сопоставления по дате, кроме ISODate в агрегации?

Мой вопрос относительно прост. У меня есть коллекция документов, которые выглядят так

    {
     _id:"61f52b609f97a100092842f2"
     timestampISO:2022-01-29T11:56:14.000+00:00
    }

TimestampISO — это тип даты.

Есть ли способ сопоставить по дате без использования ISODate("..."), как показано в этом отвечать? Я пытаюсь не использовать ISODate(''), так как на самом деле хотел бы сохранить конвейер в виде строки в Mongo, но сейчас это не важно.

Я бы хотел провести такой матч

$match: {
   timestampISO: {
       $gte: {
          $dateFromString: {
            dateString: '2022-01-01T11:56:14.000+00:00',
          }
       },
       $lte: {
          $dateFromString: {
            dateString: '2022-01-29T11:56:14.000+00:00',
          }
       },
   }
}

который не работает. Кажется, что ISODate() кажется единственным способом? Это верно?

Спасибо за ваше время.

По какой причине вы не используете ISODate()?

Wernfried Domscheit 18.03.2022 15:12

@WernfriedDomscheit Я действительно хочу сохранить конвейер в виде строки в Mongo. Затем мне нужно будет получить конвейер и проанализировать его с помощью JSON.parse(pipeline), но, к сожалению, ISODate() нужно будет заключить в кавычки, что означает, что он не будет работать.

DanH 18.03.2022 15:24

Да, ISODate() доступен только в оболочке mongo. Тогда, возможно, нативным способом: { timestampISO: { $gt: { "$date:" '2022-01-01T11:56:14.000+00:00' } } }

Wernfried Domscheit 18.03.2022 17:17

Я думаю, что в вашем случае есть гораздо более простое решение. Используйте EJSON.stringify и EJSON.parse, они поддерживают объекты Date, и вам не нужно заботиться о каких-либо ограничениях.

Wernfried Domscheit 19.03.2022 19:06
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
4
17
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

ISODate() — это просто псевдоним в оболочке Mongo для new Date().

{ $dateFromString: { dateString: '2022-01-01T11:56:14.000+00:00' } } более или менее то же самое, однако вы должны использовать

{
   $match: {
      $expr: {
         $gte: [
            "$timestampISO",
            { $dateFromString: { dateString: '2022-01-01T11:56:14+00:00' } }
         ]
      }
   }
}

или, может быть, немного проще:

{ $match: 
    {$expr: {$gte: ["$timestampISO", { $toDate: '2022-01-01T11:56:14.000+00:00' } ] }}
}

Использование $expr было уловкой. Спасибо тебе за это. Затем я сделал то же самое и для $lte.

DanH 18.03.2022 18:40

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