MongoDb /猫鼬汇总问题与匹配日期

时间:2018-11-12 13:47:28

标签: mongodb date mongoose aggregate iso

我正在尝试使用Mongoose / MongoDb的聚合函数根据日期匹配文档。虽然我的汇总函数通过其他过滤器匹配文档,但是它根本无法基于日期运行。我在下面共享我的代码。

rje::powerSet(letters[1:4])[-1]

[[1]]
[1] "a"

[[2]]
[1] "b"

[[3]]
[1] "a" "b"

[[4]]
[1] "c"

[[5]]
[1] "a" "c"

[[6]]
[1] "b" "c"

[[7]]
[1] "a" "b" "c"

[[8]]
[1] "d"

[[9]]
[1] "a" "d"

[[10]]
[1] "b" "d"

[[11]]
[1] "a" "b" "d"

[[12]]
[1] "c" "d"

[[13]]
[1] "a" "c" "d"

[[14]]
[1] "b" "c" "d"

[[15]]
[1] "a" "b" "c" "d"

我尝试了各种不同的日期,从存储在mongoDb数据库中的ISO日期开始,但是似乎没有一个起作用。我不知道这个问题的原因是什么。尽管我在网上进行了广泛搜索,但没有发现任何结论性的信息。在mongoDb shell上执行的同一查询工作正常,使我相信这可能与Mongoose以及它转换日期的方式有关。

这是我正在测试的数据

"$match": {
    "createdAt": {"$lt": new Date()}
}

我陷入困境,不知道如何继续前进。根据我的理解,我已经尝试了所有方法,但似乎没有任何效果。希望我能在这个问题上得到一些帮助。

非常感谢,谢谢。

1 个答案:

答案 0 :(得分:0)

您可能面临时区问题。我只是尝试在new Date().getTimezoneOffset()内部和node内部调用mongo。两者都返回不同的结果(节点在我的机器上返回-60,mongo shell返回0)。

您可以使用以下代码删除时区偏移:

let d = new Date()
var offset = d.getTimezoneOffset() * 60000 // This converts the given minutes to milliseconds.
var utc = d.getTime() + offset
var nd = new Date(utc)

"$match": {
    "createdAt": { "$lt": nd }
}

转换时间后,您现在应该可以获得预期的结果。

这很明智,因为MongoDB使用UTC作为时间格式。在原始JavaScript中,该转换可能看起来有些麻烦。您也可以使用moment.js之类的库。