Mongoid日期范围查询

时间:2011-05-06 04:39:41

标签: ruby-on-rails mongodb mongoid

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

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中没有太多帮助。

很想知道我做错了什么:)

3 个答案:

答案 0 :(得分:11)

答案 1 :(得分:2)

我做了一些研究,发现了帖子Advanced Queries,其中有一位用户问:

  

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

另一位用户对此的回复:

  

使用本机BSON日期类型。   在内部,它是64位整数   从那以后的毫秒数   历元。

因此,您可能希望以不同的方式处理此问题,并在范围查询的纪元以来的毫秒数之间进行转换。这样你就可以在整数上做一个简单的gte/lt。用户的建议相对较新(3个月前发布),因此它可能仍然是最简单的方式来比较日期与Mongo(因此Mongoid)。

答案 2 :(得分:0)

我使用MongoDB shell来测试它:

执行了几次

  

db.con.save({created:new Date()})

然后我得到了

> 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中做到这一点我不知道。