Използване на $where
трябва да се избягва в повечето случаи, тъй като и двете ще извикат сканиране на пълна колекция, независимо от това какви други условия биха могли да използват избор на индекс.
Освен това вие извиквате интерпретатора на JavaScript над всеки резултатен документ, което ще бъде значително по-бавно от собствения код. Прочетете предупрежденията на страницата с ръководство, те са там с причина
Когато е възможно, моля, опитайте да използвате .aggregate()
вместо това за този тип сравнение. Във вашия случай определено е по-добрият вариант:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
Това ви позволява първо да филтрирате заявката си по условието "флаг" и след това да проверите всеки член на масива, за да сравните дали двете полета са еднакви.
Ако е необходимо, след това можете да върнете съвпадащите елементи на масива в масив, където има повече от едно съвпадение. Но не мисля, че това е вашето изискване.