1
我们有一个复合索引像{a,b,c}
和查询是像
{$or:[{a: <value 1>, b: <value 2>}, {a: <value 2>, b: <value 1>}], c: {$gte: <value c1>, $lte: <value c2>}}
然后,索引用于仅部分即
indexBounds" : {
"a" : [
[
<value 1>,
<value 1>
]
],
"b" : [
[
<value 2>,
<value 2>
]
],
"c" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
和其它类似的光标与其他价值的组合。结果数据将在'c'上过滤。因此,我们有比最终结果更多的nscannned和nscannedobjects。 如果我们有查询,如下
{$or:[{a: <value 1>, b: <value 2>, c: {$gte: <value c1>, $lte: <value c2>}}, {a: <value 2>, b: <value 1>, c: {$gte: <value c1>, $lte: <value c2>}}]}
则索引完全使用,我们已经nscanned = N 的问题 - 这是$或试图对任何使用索引表达式中,而正常行为比结合整个查询还是缺少任何东西。