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 5

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 и Но мне нравятся дополнительные нули как напоминание о том, что я на самом деле работаю не только с датой.