MongoMapper:查找在指定日期创建的所有文档

时间:2011-11-21 23:10:34

标签: ruby mongodb mongomapper

我需要编写一个查询,查找在指定日期创建的所有文档。

我们假设日期是今天。

我试过了:

Document.all(:created_at => Date.parse(Time.now.strftime('%Y/%m/%d')))

但我得到了:

  

无法将类Date的对象序列化为BSON。

感谢您的帮助。

更新 此链接说明了如何执行此操作Date Range Queries With MongoMapper

Document.count( :created_at => { '$gt' => 2.days.ago.midnight, '$lt' => 1.day.ago.midnight } )

4 个答案:

答案 0 :(得分:5)

更新:此链接说明了如何执行此操作Date Range Queries With MongoMapper

Document.count( :created_at => { '$gt' => 2.days.ago.midnight, '$lt' => 1.day.ago.midnight } )

答案 1 :(得分:2)

只需使用Time.now即可。 ruby驱动程序知道如何处理Time对象。

doc = {:created_at => Time.now}

doc = {:created_at => Time.utc(12,1,12)} # year, month, day

然后,您可以测试文档是否序列化而不会像这样抛出错误:

require 'bson'

BSON.serialize(doc)

如果收到错误,请重试。如果它吐出一个序列化的bson对象,你就可以了!

如果您有好奇心,请查看mongomapper驱动程序hereto_mongo方法的来源

答案 2 :(得分:2)

您的:created_at是一个日期(如“带有日期和时间组件的JavaScript样式日期”),对吧?您需要以UTC格式确定相关日期的边界,为这些边界构建Time个实例,然后在这些时间之间搜索所有内容。

假设您的本地时区已正确配置,并且您想要在2011-11-21创建的所有内容,那么这样的内容可以帮助您:

start_time = Time.new(2011,11,21, 0,0,0).utc
end_time   = Time.new(2011,11,22, 0,0,0).utc
docs       = Document.where(:created_at => { :$gte => start_time }).
                      where(:created_at => { :$lt  => end_time   })

您也可以使用Time.new(2011, 11, 21).utcTime.new(2011, 11, 22).utc,但我更喜欢额外的零,以提醒我我并不只是在约会。

答案 3 :(得分:0)

使用@mu-is-to-short 指出的技术来创建日期。

但是 where 语句的格式可以更简单:

date = Time.new(2021,1,24, 0,0,0).utc
docs = Document.where(:updated_at.gte => date).all