Abyste z indexu vytěžili maximum, musíte mít $match dostatečně brzy v kanálu, který využívá všechna pole v indexu. A nepoužívejte $and
protože je to zbytečné a v aktuální verzi (2.4) může způsobit, že index nebude plně využit (naštěstí opraveno pro nadcházející 2.6).
Dotaz však není zcela správný, protože musíte použít $elemMatch
abyste se ujistili, že stejný prvek je použit pro splnění polí name a value.
Váš dotaz by měl být:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
Teď to není bude to krytý dotaz, protože atributy.hodnota a název jsou vloženy, nemluvě o tom, že název není v indexu.
Musíte mít index {"type":1, "attributes.value":1, "attributes.name":1}
pro nejlepší výkon, i když to stále nebude zahrnuto, bude mnohem selektivnější než nyní.