複合マルチキー インデックスには 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のインデックスは何ですか?複合インデックスには、最初のフィールドのみをカバーする値がありますか?