mongodb -日期比较不适用于聚合

lokaqttq  于 2023-03-17  发布在  Go
关注(0)|答案(2)|浏览(111)

我有以下的聚合:

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”)),它总是表现相同。有人能解释一下为什么以及如何修复吗?

falq053o

falq053o1#

日期格式错误,请使用符合ISO-8601的格式:

new Date("2015-06-17T10:03:46Z")

ISODate("2015-06-17T10:03:46Z")

ISODate()是mongo shell中new Date()的别名。
2015-06-17 10:03:46Z是常用的,但如果您想指定某一天的时间,则不符合ISO-8601标准。

6tqwzwtp

6tqwzwtp2#

问题是在mongodb中的聚合,日期总是以numberLong格式存储,最后一个不适合进行比较,因为numberLong也不存储为数字,而是存储为字符串,例如:{创建时间:新日期('2023 -03- 05')}将存储为{“创建时间”:{“$日期”:{"$数字长:“1677974400000”〈--字符串而不是数字} } },因此比较返回的结果总是空([]),从这里我建议另一个解决方案,我的工作形式,想法非常简单,我们添加了一个名为“dateCreation”的新字段,它是将日期“createdAt”转换为双精度值的结果,然后我们我可以使用它进行比较,如下所示:

db.runCommand(
  {"aggregate":"Order","pipeline":[
    {"$match":{"shopId":28440395907}},
    {"$addFields":{"dateCreation":{"$toDouble": "$createdAt"}}},
    {"$match":{"dateCreation":{"$gte":0}}},
    {"$sort":{"updatedAt":-1}},
    {"$facet":{"results":[{"$skip":0},{"$limit":25}],"count":[{"$count":"count"}]}}
  ],"allowDiskUse":true,"cursor":{}}
);

我知道这个问题很古老,已经过去两年多了,但除了这个之外,我还没有找到一种处理聚合的方法

相关问题