2013-05-27 13 views
32

ensureIndex(data)と呼ぶと、典型的なデータがdata:{name: "A",age:"B", job : "C"}のように見えるときはどうなりますか?これらの3つのフィールドに複合インデックスを作成するのか、データから何かが要求されたとき、またはまったく異なるものがあるときに、1つのインデックスしか作成されませんか?mongoのサブ文書番号

+1

それはチェックするのは簡単です。テストコレクションを作成し、 '.explain()'を使っていくつかの問い合わせを実行するだけです。それは私がやることです。私は自分が何をするのか分からない。 –

答えて

41

あなたは行うことができますいずれか:これはindexes-on-embedded-fields下の文書で説明されており、サブ文書のセクションの重要な部分は、「実行平等サブ文書に一致する、フィールドオーダー

あるindexes on sub documents

> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1}) 
> db.collection.ensureIndex({"data": 1}) 

問題とサブ文書は正確に一致しなければなりません。

これは、単純なクエリで2つのインデックスが同じであることを意味します。

しかし、サブドキュメントの例に示すように、特定のフィールドではなくサブドキュメント全体をインデックス化して比較演算子を実行するだけで、(期待していない)興味深い結果が得られます。 $gte) - 特定のサブフィールドにインデックスを付けると、柔軟性は低くなりますが、潜在的により有用なインデックスになります。

実際はすべてあなたのユースケースによって異なります。あなたは何を確認することができ、インデックスを作成した後

とにかく、で作成されます:あなたはそれがdata.name_1_data.age_1_data.job_1と呼ばれる新しいキーを作成した出力から見ることができるように

> db.collection.getIndexes() 
[ 
{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "ns" : "test.collection", 
    "name" : "_id_" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "data.name" : 1, 
     "data.age" : 1, 
     "data.job" : 1 
    }, 
    "ns" : "test.collection", 
    "name" : "data.name_1_data.age_1_data.job_1" 
} 

]

_id_インデックスです常に作成されます)。

あなたの新しいインデックスをテストしたい場合は、あなたが行うことができます:

> db.collection.insert({data:{name: "A",age:"B", job : "C"}}) 
> db.collection.insert({data:{name: "A1",age:"B", job : "C"}}) 
> db.collection.find({"data.name" : "A"}).explain() 
{ 
    "cursor" : "BtreeCursor data.name_1_data.age_1_data.job_1", 
    .... more stuff 

主なものは、あなたがあなたの新しいインデックスが使用されたことを見ることができるということです(BtreeCursorのdata.name_1_data.age_1_data.job_1でカーソルフィールドは、これがそうであることを示すものです)。 "cursor" : "BasicCursor"が表示された場合、インデックスは使用されませんでした。

詳細については、hereをご覧ください。

-1

あなたはこれを試すことができます。

db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1}) 
+3

これは質問に答えません。つまり、これを実行した結果は何ですか? – Christophe