3

複合マルチキー インデックスには 1 つの配列フィールドのみが含まれる可能性があることを理解しています。

次の場合、「並列配列にインデックスを付けることができません」というエラーは発生しません。

db.test.ensureIndex({"values.x": 1, "values.y": 1})

db.test.insert({"values": [ {"x": 1, "y": 2}, {"x": 2, "y": 2} ]})
db.test.insert({"values": [ {"x": 2, "y": 1}, {"x": 1, "y": 1} ]})
db.test.insert({"values": [ {"x": 1, "y": 1}, {"x": 1, "y": 1} ]})

そのため、オブジェクトが 1 つの配列フィールドにネストされている複数のオブジェクト プロパティに対して複合インデックスが許可されているようです。

ドキュメントには、「MongoDB は配列内の各値に個別にインデックスを付ける」と書かれているため、上記のシナリオでは、各ドキュメントの values.x と values.y のすべての組み合わせのインデックス エントリが作成されると予想していました。

ただし、ネストされた両方のフィールドに対する次のクエリは、複合インデックスの最初のフィールドのみが使用されることを示唆しています - nscanned は 2 であり、Mongo が 2 番目に追加されたドキュメントを調べて、x = に一致する配列の要素の y = 2 をチェックする必要があることを示唆しています。 2.

db.test.find({"values.x": 2, "values.y": 2}).explain()
{
    "cursor" : "BtreeCursor values.x_1_values.y_1",
    "isMultiKey" : true,
    "n" : 1,
    "nscannedObjects" : 2,
    "nscanned" : 2,
    "nscannedObjectsAllPlans" : 2,
    "nscannedAllPlans" : 2,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
            "values.x" : [
                    [
                            2,
                            2
                    ]
            ],
            "values.y" : [
                    [
                            {
                                    "$minElement" : 1
                            },
                            {
                                    "$maxElement" : 1
                            }
                    ]
            ]
    },
    "server" : "localhost:27017"
}

MongoDBのインデックスは何ですか?複合インデックスには、最初のフィールドのみをカバーする値がありますか?

4

1 に答える 1