Um das Beste aus dem Index herauszuholen, müssen Sie früh genug ein $match in der Pipeline haben, das alle Felder im Index verwendet. Und vermeiden Sie die Verwendung von $and
-Operator, da er unnötig ist und in der aktuellen Version (2.4) dazu führen kann, dass ein Index nicht vollständig genutzt wird (glücklicherweise für die kommende Version 2.6 behoben).
Die Abfrage ist jedoch nicht ganz korrekt, da Sie $elemMatch
verwenden müssen um sicherzustellen, dass dasselbe Element verwendet wird, um die Namens- und Wertfelder zu erfüllen.
Ihre Abfrage sollte lauten:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
Jetzt ist es nicht wird eine abgedeckte Abfrage sein, da die Attributes.value und name eingebettet sind, ganz zu schweigen von der Tatsache, dass name nicht im Index enthalten ist.
Der Index muss {"type":1, "attributes.value":1, "attributes.name":1}
sein Für die beste Leistung, obwohl es immer noch nicht abgedeckt wird, wird es viel selektiver sein als jetzt.