Per ottenere il massimo dall'indice è necessario disporre di una corrispondenza $ abbastanza presto nella pipeline che utilizzi tutti i campi nell'indice. Ed evita di usare $and
operatore poiché non è necessario e nella versione corrente (2.4) può causare il mancato utilizzo completo di un indice (fortunatamente risolto per la prossima 2.6).
Tuttavia, la query non è del tutto corretta poiché è necessario utilizzare $elemMatch
per assicurarsi che lo stesso elemento venga utilizzato per soddisfare i campi nome e valore.
La tua domanda dovrebbe essere:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
Ora, non sarà una query coperta, poiché gli attributi.value e name sono incorporati, per non parlare del fatto che il nome non è nell'indice.
È necessario che l'indice sia {"type":1, "attributes.value":1, "attributes.name":1}
per le migliori prestazioni, anche se non sarà ancora coperto, sarà molto più selettivo di adesso.