Mongoose $ gt与Date返回$ gte结果

时间:2014-04-24 17:23:31

标签: date datetime mongoose

我有一些代码试图在指定时间后获取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)

2 个答案:

答案 0 :(得分:0)

所以我的猜测是你几天都在思考并且没有意识到,如果specifiedDate在一天开始的实例午夜,那么在那一天的任何时间更新的所有帖子都会被视为"大于"就mongodb而言。也许您需要在查询后specifiedDate之后使用午夜,并将运营商更改为$gte?请记住,JavaScript中的日期精确到毫秒级,因此要使两个日期相等,它们必须以完全相同的毫秒发生,这就是我的理论,即你在几天而不是几毫秒内思考。

答案 1 :(得分:0)

我有一个似乎相同的问题。我正在发布此消息,尽管我不确定是否是同样的问题,因为我花了很多时间,可能会对其他人有所帮助。

在我的情况下,单元测试失败,因为尽管在date属性上使用$gt并返回了与保存文档所用的日期对象相同的日期对象,但是它返回了文档。

当我仅将日期放入Chai发送的查询中时,它失败了,并且还使用了moment.utc

至少对于moment.utc来说,它似乎被截断了几秒钟,因为我不得不加一秒钟才能使其与$gt一起工作。加少一点,例如100毫秒是行不通的。

但是在Date对象上使用方法toISOString()并将结果传递给查询,可以按预期与$gt一起使用。