У нас есть составной индекс, такой как {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 Вопрос - это нормальное поведение с $or, который пытается использовать индекс для чего-либо внутри выражения, а не для объединения всего запроса, или мы что-то упустили.