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

Jak vrátit dokumenty, kde mají dvě pole stejnou hodnotu

Zde máte dvě možnosti. Prvním z nich je použití $where operátor.

Collection.find( { $where: "this.start === this.end" } )

Druhou možností je použít agregační rámec a $redact operátor.

Collection.aggregate([
    { "$redact": { 
        "$cond": [
            { "$eq": [ "$start", "$end" ] },
            "$$KEEP",
            "$$PRUNE"
        ]
    }}
])

$where operátor provádí vyhodnocení JavaScriptu a nemůže využívat indexy, takže dotazujte pomocí $where může způsobit pokles výkonu vaší aplikace. Viz úvahy . Pokud použijete $where, každý váš dokument bude převeden z BSON na objekt JavaScript před operací $where, což způsobí pokles výkonu. Váš dotaz lze samozřejmě zlepšit, pokud máte indexový filtr. Pokud vytváříte svůj dotaz dynamicky na základě uživatelského vstupu, existuje také bezpečnostní riziko.

$redact jako $where nepoužívá indexy a dokonce neprovádí skenování kolekce, ale výkon dotazů se zlepší, když $redact protože se jedná o standardní operátory MongoDB. Jak již bylo řečeno, možnost agregace je mnohem lepší, protože svůj dokument můžete vždy filtrovat pomocí operátoru $match.

$where tady je to v pořádku, ale dalo by se tomu vyhnout. Také věřím, že potřebujete pouze $where když máte problém s návrhem schématu. Dobrou volbou zde může být například přidání dalšího booleovského pole do dokumentu s indexem.



  1. Agregát Moongoose $match neodpovídá id

  2. Chyba aplikace po nasazení aplikace Meteor 1.0 na heroku

  3. Chyba ověření při připojování k Mongo Atlas z Mule

  4. Chyba v pojmenování sbírky Mongoose?