De $where
gebruiken
operator moet in de meeste gevallen worden vermeden, omdat beide een volledige collectiescan zullen oproepen, ongeacht welke andere omstandigheden een indexselectie zouden kunnen gebruiken.
Bovendien roept u de JavaScript-interpreter op over elk resultaatdocument, dat aanzienlijk langzamer zal zijn dan de native code. Lees de waarschuwingen op de handleiding, ze zijn er met een reden
Probeer waar mogelijk .aggregate()
voor dit soort vergelijking. In jouw geval is het zeker de betere optie:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
Hierdoor kunt u uw zoekopdracht eerst filteren op de voorwaarde "vlaggen" en vervolgens elk lid van de array inspecteren om te vergelijken of de twee velden hetzelfde zijn.
Indien nodig kunt u vervolgens de overeenkomende array-elementen terugdraaien naar een array waar er meer dan één overeenkomst is. Maar ik denk niet dat dat uw vereiste is.