web-dev-qa-db-ja.com

mongoのサブドキュメントインデックス

典型的なデータがdata:{name: "A",age:"B", job : "C"}のように見えるときにensureIndex(data)を呼び出すとどうなりますか?これらの3つのフィールドに複合インデックスを作成しますか、それともデータからの何かが要求された場合、またはまったく異なるものに適用できるインデックスが1つだけ作成されますか?

35
slezadav

次のいずれかを実行できます。

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

これについては、ドキュメントの 埋め込みフィールドのインデックス および サブドキュメントのインデックス で説明しています。

サブドキュメントセクションの重要なセクションは 'サブドキュメントで等値一致を実行する場合、フィールドの順序が重要であり、サブドキュメントは完全に一致する必要があります。'

これは、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"が表示される場合、インデックスは使用されていません。

詳細については、 こちら をご覧ください。

44
jimoleary