För att få ut det mesta av indexet måste du ha en $match tillräckligt tidigt i pipelinen som använder alla fält i indexet. Och undvik att använda $and
operatör eftersom det är onödigt och i den nuvarande (2.4) versionen kan göra att ett index inte utnyttjas fullt ut (lyckligtvis fixat för den kommande 2.6).
Frågan är dock inte helt korrekt eftersom du behöver använda $elemMatch
för att se till att samma element används för att uppfylla namn- och värdefälten.
Din fråga bör vara:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
Nu är det inte kommer att vara en täckt fråga, eftersom attributes.value och name är inbäddade, för att inte tala om det faktum att namnet inte finns i indexet.
Du behöver indexet vara {"type":1, "attributes.value":1, "attributes.name":1}
för bästa prestanda, även om det fortfarande inte kommer att täckas, kommer det att vara mycket mer selektivt än nu.