Mongoはデフォルトで_idフィールドにインデックスを付け、ObjectIdはすでにタイムスタンプで開始しているため、基本的に、Mongoは挿入時間によってコレクションにインデックスを付けています。したがって、Mongoのデフォルトを使用している場合は、2番目のタイムスタンプフィールドにインデックスを付ける必要はありません(または追加する必要もありません)。
rubyでオブジェクトIDの作成時間を取得するには、次のようにします。
ruby-1.9.2-p136 :001 > id = BSON::ObjectId.new
=> BSON::ObjectId('4d5205ed0de0696c7b000001')
ruby-1.9.2-p136 :002 > id.generation_time
=> 2011-02-09 03:11:41 UTC
特定の時間のオブジェクトIDを生成するには:
ruby-1.9.2-p136 :003 > past_id = BSON::ObjectId.from_time(1.week.ago)
=> BSON::ObjectId('4d48cb970000000000000000')
したがって、たとえば、過去1週間に挿入されたすべてのドキュメントをロードする場合は、past_idより大きくidより小さい_idを検索するだけです。したがって、Rubyドライバーを介して:
collection.find({:_id => {:$gt => past_id, :$lt => id}}).to_a
=> #... a big array of hashes.
もちろん、タイムスタンプ用に別のフィールドを追加してインデックスを作成することもできますが、Mongoがデフォルトの_idフィールドを使用して必要な作業をすでに行っている場合は、パフォーマンスが低下しても意味がありません。
オブジェクトIDの詳細。