Utilisation de $where
L'opérateur doit être évité dans la plupart des cas, car il appellera tous les deux une analyse complète de la collection, quelles que soient les autres conditions susceptibles d'utiliser une sélection d'index.
De plus, vous appelez l'interpréteur JavaScript sur chaque document de résultat, ce qui sera considérablement plus lent que le code natif. Lisez les avertissements sur la page de manuel, ils sont là pour une raison
Dans la mesure du possible, essayez d'utiliser .aggregate()
plutôt pour ce type de comparaison. Dans votre cas, c'est certainement la meilleure option :
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
Cela vous permet de filtrer d'abord votre requête par la condition "drapeau", puis d'inspecter chaque membre du tableau pour comparer si les deux champs sont identiques.
Si nécessaire, vous pouvez ensuite restaurer les éléments de tableau correspondants dans un tableau où il existe plusieurs correspondances. Mais je ne pense pas que ce soit votre exigence.