2011-05-06 221 views
14

我似乎无法找到任何使用Mongoid/Rails进行日期范围查询的任何内容。以下是我尝试过的一些查询(约100人之中)。如果它返回任何东西,它总是忽略'end_date'。两个日期都是日期时间...Mongoid日期范围查询

all(:conditions => {:created_at => start_date.to_datetime..end_date.to_datetime}) 

结果:

NoMethodError: undefined method `to_i' for Tue, 26 Apr 2011 00:00:00 +0000..Fri, 06 May 2011 00:00:00 +0000:Range 

另一个例子......

where(:created_at => {'$gte' => start_date,'$lt' => end_date}) 

导致一个成功的查询,但结束日期将被忽略。结果在开始日期后正确返回,但不受结束日期的限制。

我一直在解决这个问题好几天无济于事。在网上,在论坛或IRC上帮助不大。

很想弄清楚我在做什么错:)

回答

11
+1

确实在Mongoid 2.0.2中已经修复了这个问题,但是我找不到任何有关这个bug修复的文档......这有点令人担心,这些bug可能会对我的应用程序产生重大影响......不知道该怎么办以防止这样的问题,如果它在未来的版本中再次破坏:( – Alex 2011-06-26 14:00:46

+1

而且它似乎再次打破。在这里的Mongoid 3.0,同样的问题。 – Michael 2013-02-09 09:40:56

0

我使用MongoDB的shell来测试:

执行该几次

db.con.save({创建新的日期()})

然后我

> db.con.find() 
{ "_id" : ObjectId("4dc3d380724a42d80d636b09"), "created" : ISODate("2011-05-06T10:54:56.809Z") } 
{ "_id" : ObjectId("4dc3d383724a42d80d636b0a"), "created" : ISODate("2011-05-06T10:54:59.699Z") } 
{ "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") } 
{ "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") } 
{ "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") } 
{ "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") } 

作为分割日期我选择ISODate("2011-05-06T10:55:00Z")使用d = new Date(2011,04,06,12,55,00)创建此差异从月份开始于零开始,时间为utc时区。 现在db.con.find({"created": {$gt:d}})产生

{ "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") } 
{ "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") } 
{ "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") } 
{ "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") } 

所以MongoDB的做的一切是正确的。如何在Ruby中做到这一点是我不知道的。

+1

感谢您的帮助。我发现了一个有效的Mongoid补丁。 – 2011-05-07 14:39:04

2

我做了一些研究和跨岗位Advanced Queries,在其中一个用户请求传来:

有没有更好的方式来进行排序或查询 使用日期时间的比较,比 存储蒙戈的日期一个 自纪元以来的整数秒?这 是目前唯一的方式,是 工作我做Mongo比较 检索结果。

其他用户的回复是:

使用本地BSON日期类型。 从内部看,这是一个64位整数 自 开始的毫秒数。

因此,您可能想要采用不同的方法,并在范围查询的时间之间的毫秒数之间进行转换。这样你就可以在整数上做一个简单的gte/lt。用户的建议是比较新的(3个月前发布),所以它可能仍然是比较日期与一般Mongo(以及Mongoid)的最简单方法。

+0

感谢您的帮助。我发现了一个有效的Mongoid补丁。 – 2011-05-07 14:38:52