2012-02-16 6 views
3

私はインデックスを追加したいMongoDBコレクションを持っています。この投稿の目的のために、コレクション名がCatsであるとしましょう。MongoDBコレクションのハッシュフィールドにインデックスを追加する

Cat.first(:conditions => { "metaData.id" => an_id }

:このようなもので、

> db.cats.findOne(); 
{ 
    "_id" : ObjectId("4f248f8ae4b0b775c9eb002d"), 
    "metaData" : { 
     "type" : "cute", 
     "id" : "4ed3b6c599114b488be52bc3" 
    }, 
     .... 
} 

私は(Mongoidを使用して)非常に頻繁に照会:あなたがdb.cats.findOne();を行うので、もし私はそれは次のようになりますCatsコレクションのハッシュキーを持っています

私は本当にここでインデックスの利点を利用できるようにしたいと思いますが、私はすべてのmetaDataまたは単にmetaData.id(私はIDを特定して、非常に頻繁に)クエリする必要があるかどうかは完全にはわかりません。

私はここで正しいことをすれば、私は劇的にクエリを高速化できると思うので、この問題に対する解決策が大好きです。また、これはユニークなインデックスです。

また、metaDataは埋め込みドキュメントではありません。独自のコレクションはありません。それぞれのcatsオブジェクトに1:1のマッピングを持つ単純なハッシュです。

答えて

4

埋め込みドキュメントにインデックスを定義することができます。これはここに覆われている:あなたの具体的な例

http://www.mongodb.org/display/DOCS/Indexes#Indexes-UsingDocumentsasKeys

を、これは次のようになります。

db.Cats.ensureIndex({ "metaData.id" : 1}, {unique : true}) 

あなたの結果は.explainとシェルのあなたの標準的なクエリの一部を行う比較するには()に索引の有無にかかわらず速度を比較する。多くのクエリを実行していない場合は、インデックスをキャッシュしないようにインデックスをヒントする必要があります(デフォルトで_idにインデックスがあることを忘れないでください)。詳細な情報はこちら

http://www.mongodb.org/display/DOCS/Explain