Để tận dụng tối đa chỉ mục, bạn cần có $ khớp đủ sớm trong quy trình sử dụng tất cả các trường trong chỉ mục. Và tránh sử dụng $and
vì nó không cần thiết và trong phiên bản (2.4) hiện tại có thể khiến một chỉ mục không được sử dụng đầy đủ (may mắn là đã được sửa cho phiên bản 2.6 sắp tới).
Tuy nhiên, truy vấn không hoàn toàn chính xác vì bạn cần sử dụng $elemMatch
để đảm bảo rằng cùng một phần tử được sử dụng để đáp ứng các trường tên và giá trị.
Truy vấn của bạn phải là:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
Bây giờ, nó không sẽ là một truy vấn được bao phủ, vì các thuộc tính. giá trị và tên được nhúng, chưa kể đến thực tế là tên không có trong chỉ mục.
Bạn cần chỉ mục là {"type":1, "attributes.value":1, "attributes.name":1}
để có hiệu suất tốt nhất, mặc dù nó vẫn chưa được đề cập, nhưng nó sẽ được lựa chọn nhiều hơn bây giờ.