Utilizzando $where
l'operatore dovrebbe essere evitato nella maggior parte dei casi poiché entrambi invocheranno una scansione completa della raccolta indipendentemente da quali altre condizioni potrebbero utilizzare una selezione dell'indice.
Inoltre stai invocando l'interprete JavaScript su ogni documento di risultato, che sarà notevolmente più lento del codice nativo. Leggi gli avvisi nella pagina di manuale, ci sono per un motivo
Ove possibile, prova a utilizzare .aggregate()
per questo tipo di confronto invece. Nel tuo caso è sicuramente l'opzione migliore:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
Ciò ti consente di filtrare prima la tua query in base alla condizione "flag" e quindi di ispezionare ciascun membro dell'array per confrontare se i due campi sono uguali.
Se necessario, puoi quindi ripristinare gli elementi dell'array abbinati in un array in cui sono presenti più corrispondenze. Ma non credo che sia una tua esigenza.