Verwenden von $where
-Operator sollte in den meisten Fällen vermieden werden, da er unabhängig davon, welche anderen Bedingungen möglicherweise eine Indexauswahl verwenden könnten, einen vollständigen Sammlungsscan aufruft.
Außerdem rufen Sie den JavaScript-Interpreter über jedes Ergebnisdokument auf, was erheblich langsamer sein wird als nativer Code. Lesen Sie die Warnungen auf der Handbuchseite, sie sind aus einem bestimmten Grund vorhanden
Versuchen Sie nach Möglichkeit, .aggregate()
für diese Art von Vergleich. In Ihrem Fall ist es definitiv die bessere 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
}}
])
Auf diese Weise können Sie Ihre Abfrage zuerst nach der Bedingung "Flag" filtern und dann jedes Mitglied des Arrays untersuchen, um zu vergleichen, ob die beiden Felder gleich sind.
Bei Bedarf können Sie dann die übereinstimmenden Array-Elemente in ein Array zurücksetzen, in dem mehr als eine Übereinstimmung vorhanden ist. Aber ich glaube nicht, dass das Ihre Anforderung ist.