インデックスを最大限に活用するには、インデックス内のすべてのフィールドを使用するパイプラインの早い段階で$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" }}
] }
}
}]);
さて、ではありません nameがインデックスにないことは言うまでもなく、attributes.valueとnameが埋め込まれているため、対象となるクエリになります。
インデックスは{"type":1, "attributes.value":1, "attributes.name":1}
である必要があります 最高のパフォーマンスを得るには、まだカバーされていませんが、現在よりもはるかに選択的です。