Bem, ele realmente faz mesmo que não neste caso. Para realmente ver o que está acontecendo, você precisa olhar para a forma "detalhada" de explicação, adicionando
true
:db.t.find({item:"abc123",qty:{$gt:15}}).explain(true)
{
"cursor" : "BtreeCursor item_1",
"isMultiKey" : false,
"n" : 84,
"nscannedObjects" : 100,
"nscanned" : 100,
"nscannedObjectsAllPlans" : 201,
"nscannedAllPlans" : 304,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 2,
"nChunkSkips" : 0,
"millis" : 2,
"indexBounds" : {
"item" : [
[
"abc123",
"abc123"
]
]
},
"allPlans" : [
{
"cursor" : "BtreeCursor item_1",
"isMultiKey" : false,
"n" : 84,
"nscannedObjects" : 100,
"nscanned" : 100,
"scanAndOrder" : false,
"indexOnly" : false,
"nChunkSkips" : 0,
"indexBounds" : {
"item" : [
[
"abc123",
"abc123"
]
]
}
},
{
"cursor" : "BtreeCursor qty_1",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 101,
"nscanned" : 102,
"scanAndOrder" : false,
"indexOnly" : false,
"nChunkSkips" : 0,
"indexBounds" : {
"qty" : [
[
15,
Infinity
]
]
}
},
{
"cursor" : "Complex Plan",
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 102,
"nChunkSkips" : 0
}
],
Corte curto, mas a última parte é o que você está procurando. Conforme explicado no manual, a aparência de "Plano Complexo" significa que uma interseção está sendo usada.
{
"cursor" : "Complex Plan",
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 102,
"nChunkSkips" : 0
}
O único caso aqui é que enquanto está sendo "observado" não está sendo escolhido pelo otimizador neste caso como a consulta mais "ótima". Portanto, o otimizador está dizendo que, de fato, o plano usando apenas um índice selecionado é aquele que será concluído da maneira mais responsiva.
Assim, embora a “interseção” tenha sido considerada, não foi a “melhor ajuste” e o índice único foi escolhido.