Menggunakan $where
operator harus dihindari dalam banyak kasus karena keduanya akan menjalankan pemindaian koleksi lengkap terlepas dari kondisi lain apa yang mungkin menggunakan pemilihan indeks.
Selain itu, Anda menggunakan juru bahasa JavaScript untuk setiap dokumen hasil, yang akan jauh lebih lambat daripada kode asli. Baca peringatan di halaman manual, itu ada karena suatu alasan
Jika memungkinkan, coba gunakan .aggregate()
untuk jenis perbandingan ini sebagai gantinya. Dalam kasus Anda, ini jelas merupakan pilihan yang lebih baik:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
Ini memungkinkan Anda untuk memfilter kueri Anda terlebih dahulu dengan kondisi "bendera" dan kemudian memeriksa setiap anggota larik untuk membandingkan apakah kedua bidang tersebut sama.
Jika perlu, Anda dapat memutar kembali elemen larik yang cocok ke dalam larik yang memiliki lebih dari satu kecocokan. Tapi saya rasa itu bukan kebutuhan Anda.