42

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

4

2 に答える 2

53

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

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

これについては、index-on-embedded-fieldsおよびindex on subdocumentsのドキュメントで説明されています。

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

これは、単純なクエリの場合、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"、インデックスは使用されていません。

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

于 2013-05-27T09:51:24.740 に答える
-3

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

db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
于 2015-01-16T09:24:53.397 に答える