For at få mest muligt ud af indekset skal du have et $match tidligt nok i pipelinen, der bruger alle felterne i indekset. Og undgå at bruge $and
operatør, da det er unødvendigt og i den nuværende (2.4) version kan forårsage, at et indeks ikke bliver fuldt udnyttet (heldigvis rettet til den kommende 2.6).
Forespørgslen er dog ikke helt korrekt, da du skal bruge $elemMatch
for at sikre, at det samme element bruges til at opfylde navne- og værdifelterne.
Din forespørgsel skal være:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
Nu er det ikke vil være en dækket forespørgsel, da attributes.value og name er indlejret, for ikke at nævne det faktum, at navn ikke er i indekset.
Du skal have indekset til at være {"type":1, "attributes.value":1, "attributes.name":1}
for den bedste ydeevne, selvom den stadig ikke vil blive dækket, vil den være meget mere selektiv end nu.