sql >> データベース >  >> NoSQL >> MongoDB

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

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

    > 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"が表示された場合 、その後、インデックスは使用されませんでした。

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



    1. トップMongoDBリソース

    2. MongoDB:パスで見つかった位置(つまり'$')要素が多すぎます

    3. Docker-compose、とにかくredis.confファイルを指定しますか?

    4. すべてのMongoコレクションをループして、クエリを実行します