我需要编写一个查询,查找在指定日期创建的所有文档。
我们假设日期是今天。
我试过了:
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 } )
答案 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驱动程序here中to_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).utc
和Time.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