Använda $where
Operatören bör undvikas i de flesta fall eftersom den både kommer att anropa en fullständig insamlingsskanning oavsett vilka andra förhållanden som skulle kunna använda ett indexval.
Dessutom anropar du JavaScript-tolken över varje resultatdokument, vilket kommer att vara betydligt långsammare än ursprunglig kod. Läs varningarna på manualsidan, de finns där av en anledning
Om möjligt, försök att använda .aggregate()
för denna typ av jämförelse istället. I ditt fall är det definitivt det bättre alternativet:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
Detta gör att du först kan filtrera din fråga efter "flagga"-villkoret och sedan inspektera varje medlem i arrayen för att jämföra om de två fälten är samma.
Om det behövs kan du sedan rulla tillbaka de matchade arrayelementen till en array där det finns mer än en matchning. Men jag tror inte att det är ditt krav.