我似乎找不到使用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中没有太多帮助。
很想知道我做错了什么:)
答案 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中做到这一点我不知道。