我明白Compound Multikey Indexes May Only Include One Array Field。MongoDB如何處理嵌套在數組中的對象屬性的複合索引?
下列不產生「不能索引平行陣列」錯誤:
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} ]})
如此看來,化合物索引允許通過其中的對象是嵌套在一個陣列中的多個字段的對象屬性。
該文檔說「MongoDB將數組中的每個值分別索引」,因此對於上述場景,我預計要創建的每個文檔中的values.x和values.y的所有組合的索引條目。
但是,對兩個嵌套字段的以下查詢表明,只有複合索引中的第一個字段被使用 - nscanned爲2,表明Mongo必須檢查添加的第二個文檔以檢查數組元素上的y = 2匹配x = 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索引,並且複合索引具有超過只包含第一個字段的值的任何值?