За да извлечете максимума от индекса, трябва да имате $match достатъчно рано в конвейера, който използва всички полета в индекса. И избягвайте да използвате $and
оператор, тъй като е ненужен и в текущата (2.4) версия може да доведе до непълно използване на индекс (за щастие коригирано за предстоящата 2.6).
Заявката обаче не е съвсем правилна, тъй като трябва да използвате $elemMatch
за да се уверите, че същият елемент се използва за удовлетворяване на полетата за име и стойност.
Вашата заявка трябва да бъде:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
Сега не ще бъде покрита заявка, тъй като attributes.value и name са вградени, да не говорим за факта, че name не е в индекса.
Трябва индексът да бъде {"type":1, "attributes.value":1, "attributes.name":1}
за най-добро представяне, въпреки че все още няма да бъде покрито, ще бъде много по-селективно от сега.