我有一些代码试图在指定时间后获取Post类型的所有文档。
帖子定义如下:{ 更新:日期 }
当我运行以下内容时:
Post.find({updated:{$ gt:specifiedDate}})
如果specifiedDate是一个值小于new Date()的Date对象,它将返回HAVE updated = specifiedDate的Post文档,而不是所有更新了AFTER specifiedDate的Posts。
因此,似乎返回$ gte查询的结果,而不是$ gt。
还有其他人观察过这个吗?
提前致谢。
修改
如果有助于澄清这种情况,Date对象将被编码并作为参数作为时间戳发送到请求中。我正在尝试获取所有“新”的帖子,这意味着所有帖子都是在最后一个可见帖子的日期之后。此Date对象是设置为req.params.timestamp的时间戳。有一个Post文档与req.params.timestamp传递的日期相同。之后的所有帖子都应该被退回,但是,这个帖子不断显示,好像我在调用$ gte而不是$ gt。
以下是查询:
Post.find({$or : [{_recipient : user.id}, {_sender : user.id, mode : POST_MODE.POST}], updated : { $gt : new Date (decodeURIComponent(req.params.timestamp)) }})
.sort({updated : -1})
当我查看控制台
时new Date (decodeURIComponent(req.params.timestamp))
...它被格式化为毫秒为
Wed Apr 23 2014 15:03:52 GMT-0400 (EDT)
答案 0 :(得分:0)
所以我的猜测是你几天都在思考并且没有意识到,如果specifiedDate
在一天开始的实例午夜,那么在那一天的任何时间更新的所有帖子都会被视为"大于"就mongodb而言。也许您需要在查询后specifiedDate
之后使用午夜,并将运营商更改为$gte
?请记住,JavaScript中的日期精确到毫秒级,因此要使两个日期相等,它们必须以完全相同的毫秒发生,这就是我的理论,即你在几天而不是几毫秒内思考。
答案 1 :(得分:0)
我有一个似乎相同的问题。我正在发布此消息,尽管我不确定是否是同样的问题,因为我花了很多时间,可能会对其他人有所帮助。
在我的情况下,单元测试失败,因为尽管在date属性上使用$gt
并返回了与保存文档所用的日期对象相同的日期对象,但是它返回了文档。
当我仅将日期放入Chai发送的查询中时,它失败了,并且还使用了moment.utc
。
至少对于moment.utc
来说,它似乎被截断了几秒钟,因为我不得不加一秒钟才能使其与$gt
一起工作。加少一点,例如100毫秒是行不通的。
但是在Date对象上使用方法toISOString()
并将结果传递给查询,可以按预期与$gt
一起使用。