2011-11-21 8 views
5

指定された日付に作成されたすべてのドキュメントを検索するクエリを作成する必要があります。MongoMapper:指定された日付に作成されたすべてのドキュメントを見つける

今日は今日だとしましょう。

私はこの試みた:

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

を私が得た:

はBSONにクラスDateのオブジェクトをシリアル化することはできません。

ありがとうございました。

更新 このリンクでは、Date Range Queries With MongoMapperのリンク方法について説明しています。

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

上記のリンクはもう動作しません。 – user2573222

答えて

5

更新:このリンクは、Date Range Queries With MongoMapperを行う方法を説明しています。

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

代わりにTime.nowを使用してください。 Rubyドライバは、Timeオブジェクトの処理方法を知っています。

doc = {:created_at => Time.now} 

または

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

その後、文書は次のようにIRBにエラーをスローせずにシリアライズされます場合は、テストすることができます。

require 'bson' 

BSON.serialize(doc) 

エラーが発生した場合は、もう一度試してください。それがシリアル化されたbsonオブジェクトを吐き出すならば、あなたは良いことです!あなたが興味があれば

、あなたの:created_atは日付が「日付と時刻のコンポーネントの両方でJavaScriptのスタイルの日」のように(あるhere

2

mongomapperドライバでto_mongo方法のソースをチェックアウト)、 右?問題の日付の境界を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しかし、私はちょうど日付で実際に働いていないことを思い出させるために余分なゼロが好きです。

関連する問題