Usando o
$where
O operador deve ser evitado na maioria dos casos, pois ambos invocarão uma varredura de coleção completa, independentemente de quais outras condições possam usar uma seleção de índice. Além disso, você está invocando o interpretador JavaScript em cada documento de resultado, que será consideravelmente mais lento que o código nativo. Leia os avisos na página de manual, eles estão lá por um motivo
Sempre que possível, tente usar
.aggregate()
para este tipo de comparação. No seu caso é definitivamente a melhor opção:db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
Isso permite que você primeiro filtre sua consulta pela condição "sinalizador" e, em seguida, inspecione cada membro da matriz para comparar se os dois campos são os mesmos.
Se necessário, você pode reverter os elementos da matriz correspondentes em uma matriz onde há mais de uma correspondência. Mas não acho que essa seja sua exigência.