Мой вопрос относительно прост. У меня есть коллекция документов, которые выглядят так
{
_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() кажется единственным способом? Это верно?
Спасибо за ваше время.
@WernfriedDomscheit Я действительно хочу сохранить конвейер в виде строки в Mongo. Затем мне нужно будет получить конвейер и проанализировать его с помощью JSON.parse(pipeline), но, к сожалению, ISODate() нужно будет заключить в кавычки, что означает, что он не будет работать.
Да, ISODate()
доступен только в оболочке mongo. Тогда, возможно, нативным способом: { timestampISO: { $gt: { "$date:" '2022-01-01T11:56:14.000+00:00' } } }
Я думаю, что в вашем случае есть гораздо более простое решение. Используйте EJSON.stringify
и EJSON.parse
, они поддерживают объекты Date
, и вам не нужно заботиться о каких-либо ограничениях.
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.
По какой причине вы не используете ISODate()?