Para obter o máximo do índice, você precisa ter uma $match suficientemente cedo no pipeline que use todos os campos do índice. E evite usar
$and
pois é desnecessário e na versão atual (2.4) pode fazer com que um índice não seja totalmente utilizado (felizmente corrigido para o próximo 2.6). No entanto, a consulta não está correta, pois você precisa usar
$elemMatch
para garantir que o mesmo elemento seja usado para satisfazer os campos de nome e valor. Sua consulta deve ser:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
Agora, não vai ser uma consulta coberta, já que os atributos.valor e nome estão embutidos, sem mencionar o fato de que o nome não está no índice.
Você precisa que o índice seja
{"type":1, "attributes.value":1, "attributes.name":1}
para melhor desempenho, embora ainda não seja coberto, será muito mais seletivo do que agora.