我正在尝试使用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()}
}
我陷入困境,不知道如何继续前进。根据我的理解,我已经尝试了所有方法,但似乎没有任何效果。希望我能在这个问题上得到一些帮助。
非常感谢,谢谢。
答案 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
之类的库。