2011-12-23 5 views
2

John Nunemakerには、Mongo ObjectIdsについての素晴らしいヒントを掲載したブログ記事があります。http://mongotips.com/b/a-few-objectid-tricks/ - 特にgeneration_timeについてのヒントに興味がありました。彼は明示的にcreated_atの時間をmongoの文書に明示的に格納する必要はないことを示唆しています。なぜなら、あなたはいつもそれを私の注意を引いたIDから引き出すことができるからです。問題は、私が持っているすべてがIDであれば、作成時間に基づいてドキュメントを見つけるためにmongomapperでmongoクエリを生成する方法を理解できません。mongo idsのgeneration_timeを照会しています

私は、鍵保管する場合:

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

(にマップ:

{created_at: {"$gt"=>Thu Dec 01 06:00:00 UTC 2011}} 
私はこのような12月1日以降に作成されたすべての文書を取得するにはmongomapperにクエリを行うことができ、文書の一部としてのcreated_atを

私はObjectIdを使って同等のクエリを作成する方法を理解できません。私はそれがこのように見えると思います(もちろん、generation_timeはルビ関数ですが、 mongoクエリのコンテキスト?)

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

もう1つ質問:mongodumpを使用してデータベースをダンプして復元すると、タイムスタンプのメタデータが失われますか? ObjectIdを保持するバックアップ/リストアテクニックは推奨されていますか?

答えて

2

thisはシェルで実行されるjavascriptコードですが、生成時間はmongomapperメソッドなので、コードには意味がありません。レールで

あなたは

自己のFooのインスタンスを参照
created_at = self.id.generation_time.in_time_zone(Time.zone) 

のようなものを言ってIDを取得します。

そして、あなたはかかわらず、なぜわざわざ

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

を言って照会でしょうが...手間がそれだけの価値はありませんが、ちょうど時間を格納します。

mongodump/restoreなどのツールを手作業で読み込んで再挿入しない限り、オブジェクトIDは保持されますので、心配する必要はありません。

+0

ここでのアイデアは、私が照会している時間から作成されたIDとIDを比較することです。だから、Idsは生成時間に関して単調に増加するだろうか? – Bee

+1

@Bee:はい、正確です。 –

関連する問題