次のいずれかを実行できます:
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
これについては、indexes-on-embedded-fieldsおよびindexes onsubdocumentsのドキュメントで説明されています
サブドキュメントセクションの重要なセクションは、'サブドキュメントで等式一致を実行する場合、フィールドの順序が重要であり、サブドキュメントは正確に一致する必要があります。'
これは、2つのインデックスが単純なクエリで同じであることを意味します。
ただし、サブドキュメントの例が示すように、特定のフィールドではなくサブドキュメント全体にインデックスを付けてから、比較演算子($gte
)-特定のサブフィールドにインデックスを付けると、柔軟性は低下しますが、より有用なインデックスになる可能性があります。
それは本当にすべてあなたのユースケースに依存します。
とにかく、インデックスを作成したら、:
で作成されたものを確認できます。> 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"
}
]
出力からわかるように、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"
が表示された場合 、その後、インデックスは使用されませんでした。
詳細については、こちらをご覧ください。