我有以下的聚合:
db.runCommand(
{"aggregate":"Order","pipeline":[
{"$match":{"shopId":28440395907}},
{"$match":{"createdAt":{"$gte":{"$date":{"$numberLong":"0"}}}}},
{"$sort":{"updatedAt":-1}},
{"$facet":{"results":[{"$skip":0},{"$limit":25}],"count":[{"$count":"count"}]}}
],"allowDiskUse":true,"cursor":{}}
);
问题是它无法返回任何结果。将日期过滤器替换为字面上的任何其他内容都可以提供结果,所以我猜测是日期转换有问题。我尝试了教程中找到的所有版本(如new Date(“2015-06-17 10:03:46.000Z”)),它总是表现相同。有人能解释一下为什么以及如何修复吗?
2条答案
按热度按时间falq053o1#
日期格式错误,请使用符合ISO-8601的格式:
或
ISODate()
是mongo shell中new Date()
的别名。2015-06-17 10:03:46Z
是常用的,但如果您想指定某一天的时间,则不符合ISO-8601标准。6tqwzwtp2#
问题是在mongodb中的聚合,日期总是以numberLong格式存储,最后一个不适合进行比较,因为numberLong也不存储为数字,而是存储为字符串,例如:{创建时间:新日期('2023 -03- 05')}将存储为{“创建时间”:{“$日期”:{"$数字长:“1677974400000”〈--字符串而不是数字} } },因此比较返回的结果总是空([]),从这里我建议另一个解决方案,我的工作形式,想法非常简单,我们添加了一个名为“dateCreation”的新字段,它是将日期“createdAt”转换为双精度值的结果,然后我们我可以使用它进行比较,如下所示:
我知道这个问题很古老,已经过去两年多了,但除了这个之外,我还没有找到一种处理聚合的方法