Untuk mendapatkan hasil maksimal dari indeks, Anda harus memiliki $match cukup awal di jalur pipa yang menggunakan semua bidang dalam indeks. Dan hindari menggunakan $and
operator karena tidak diperlukan dan dalam versi (2.4) saat ini dapat menyebabkan indeks tidak digunakan sepenuhnya (untungnya diperbaiki untuk 2.6 mendatang).
Namun, kuerinya kurang tepat karena Anda perlu menggunakan $elemMatch
untuk memastikan elemen yang sama digunakan untuk memenuhi bidang nama dan nilai.
Kueri Anda seharusnya:
db.Phone.aggregate([
{$match: { type: "Samsung",
attributes: { $all: [
{$elemMatch: {"value":"100", "type" : "BatteryLife" }},
{$elemMatch: {"value":"200$", "type" : "Price" }}
] }
}
}]);
Sekarang, ini tidak akan menjadi kueri tertutup, karena atribut.nilai dan nama disematkan, belum lagi fakta bahwa nama tidak ada dalam indeks.
Anda memerlukan indeks menjadi {"type":1, "attributes.value":1, "attributes.name":1}
untuk performa terbaik, meskipun masih belum tercakup, ini akan jauh lebih selektif daripada sekarang.