sql >> Databáze >  >> NoSQL >> MongoDB

mongodb $where dotaz k načtení obsahu dílčího dokumentu

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.



  1. Najděte první prvek ve vnořeném poli, který odpovídá podmínkám

  2. Jak spustit redis-server na jiném portu, než je výchozí port 6379 v ubuntu

  3. Jak na to:Testování aplikací HBase pomocí oblíbených nástrojů

  4. MongoDB - Projektování pole, které ne vždy existuje