Pomocí $where
Ve většině případů je třeba se vyhnout operátorovi, protože oba spustí skenování celé kolekce bez ohledu na to, jaké další podmínky by případně mohly použít výběr indexu.
Navíc nad každým výsledným dokumentem vyvoláváte interpret JavaScriptu, který bude podstatně pomalejší než nativní kód. Přečtěte si varování na manuálové stránce, jsou tam z nějakého důvodu
Pokud je to možné, zkuste prosím použít .aggregate()
místo toho pro tento typ srovnání. Ve vašem případě je to rozhodně lepší možnost:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
To vám umožní nejprve filtrovat dotaz podle podmínky "příznak" a poté zkontrolovat každý člen pole a porovnat, zda jsou tato dvě pole stejná.
V případě potřeby pak můžete vrátit zpět odpovídající prvky pole do pole, kde existuje více než jedna shoda. Ale nemyslím si, že to je váš požadavek.