MongoMapper: поиск всех документов, созданных на указанную дату - PullRequest
5 голосов
/ 22 ноября 2011

Мне нужно написать запрос, который находит все документы, созданные в указанную дату.

Предположим, что дата сегодня.

Я пробовал это:

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 голосов
/ 12 января 2012

ОБНОВЛЕНИЕ: Эта ссылка объясняет, как это сделать Запросы диапазона дат с MongoMapper .

Document.count( :created_at => { '$gt' => 2.days.ago.midnight, '$lt' => 1.day.ago.midnight } )
2 голосов
/ 22 ноября 2011

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

2 голосов
/ 22 ноября 2011

Просто используйте 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, вы готовы!

Если вам интересно, проверьте источник to_mongo метода в драйвере mongomapper здесь

...