запрос порождения времени на идентификаторах Монго - PullRequest
2 голосов
/ 24 декабря 2011

У Джона Нунемейкера есть пост в блоге с несколькими полезными советами о Mongo ObjectIds - http://mongotips.com/b/a-few-objectid-tricks/ - в частности, меня заинтересовал совет о generation_time.Он предполагает, что нет необходимости явно хранить время create_at в документах Монго, потому что вы всегда можете извлечь его из идентификатора, который привлек мое внимание.Проблема в том, что я не могу понять, как генерировать монго-запросы в mongomapper, чтобы найти документы на основе времени создания, если все, что у меня есть, это идентификатор.

Если я сохраню ключ: made_at как часть документа, я могувыполните запрос в mongomapper, чтобы получить все документы, созданные с 1 декабря, например:

Foo.where(:created_at.gt=>Time.parse("2011-12-01"))

(что соответствует:

{created_at: {"$gt"=>Thu Dec 01 06:00:00 UTC 2011}}

Я не могу понять, как сделать эквивалентзапрос с использованием ObjectId. Я думаю, это выглядело бы примерно так (хотя, конечно, generation_time - это функция ruby, но есть ли эквивалент, который я могу использовать для объекта в контексте запроса Монго?)

Foo.where('$where'=>"this.id.generation_time > new Date('2011-12-01')")
{$where: "this.id.generation_time > new Date('2011-12-01')"}

Еще один вопрос: если я откажусь от хранения отдельных временных меток, потеряю ли я метаданные временной метки, если дампа и восстановлю свою базу данных, используя mongodump? Есть ли рекомендуемые методы резервного копирования / восстановления, которые сохраняют ObjectIds?

1 Ответ

2 голосов
/ 24 декабря 2011

this - это код javascript, который запускается в оболочке, но время генерации - это метод mongomapper, поэтому он не имеет смысла в имеющемся у вас коде.

В rails вы получите идентификатор с помощьюговоря что-то вроде

created_at = self.id.generation_time.in_time_zone(Time.zone)

Где self ссылается на экземпляр Foo.

И вы бы спросили, сказав

Foo.find('_id' => {'$gte' => BSON::ObjectId.from_time(created_at)}).count

Зачем беспокоиться ... хлопотэто того не стоит, просто хранить время.

Относительно методов резервного копирования / восстановления, если только вы не читаете и не вставляете вручную mongodump / restore и подобные инструменты сохранят идентификатор объекта, так что вам не о чем беспокоитьсяо там.

...