MongoMapper: поиск всех документов, созданных на указанную дату
Мне нужно написать запрос, который находит все документы, созданные на указанную дату.
Давайте предположим, что эта дата-сегодня.Я попробовал это:
Document.all(:created_at => Date.parse(Time.now.strftime('%Y/%m/%d')))
Но я получил:
Не может сериализовать объект класса Date в BSON.
Спасибо за помощь.
Обновление Эта ссылка объясняет, как это сделать запросы диапазона дат с помощью MongoMapper .
Document.count( :created_at => { '$gt' => 2.days.ago.midnight, '$lt' => 1.day.ago.midnight } )
3 ответа:
UPDATE: Эта ссылка объясняет, как это сделать запросы диапазона дат с помощью MongoMapper.
Document.count( :created_at => { '$gt' => 2.days.ago.midnight, '$lt' => 1.day.ago.midnight } )
Просто используйте
Time.now
вместо этого. Драйвер ruby знает, как обращаться с объектами времени.doc = {:created_at => Time.now}
Или
doc = {:created_at => Time.utc(12,1,12)} # year, month, day
Затем вы можете проверить, будет ли документ сериализован без возникновения ошибки в irb, как это:
require 'bson' BSON.serialize(doc)
Если вы получили ошибку, повторите попытку. Если он выплевывает сериализованный объект bson, вы можете идти!
Если вам интересно, проверьте источник метода
to_mongo
в драйвере mongomapper здесь
Ваш
: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
и Но мне нравятся дополнительные нули как напоминание о том, что я на самом деле работаю не только с датой.