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

Jak použít $elemMatch na projekci agregátu?

Docela na starou otázku, ale doslova žádná z navrhovaných odpovědí není dobrá.

TLDR :

$elemMatch nemůžete použít ve fázi $projektu. ale stejného výsledku můžete dosáhnout pomocí jiných agregačních operátorů, jako je $filter.

db.itens.aggregate([
    {
        $project: {
            compList: {
               $filter: {
                input: "$complist",
                as: "item",
                cond: {$eq: ["$$item.a", 1]}
               }
            }
        }
    }
])

A pokud chcete jen první položku z pole, která odpovídá podmínce podobně jako $elemMatch, můžete začlenit $arrayElemAt

Hloubkové vysvětlení :

Nejprve pochopíme $elemMatch:

$elemMatch je výraz dotazu, i když existuje i jeho verze projekce, což se týká projekce dotazu a nikoli fáze agregace $project.

No a co? co to má společného s něčím? fáze $project má určitou vstupní strukturu, kterou může mít, zatímco ta, kterou chceme použít, je:

:

Co je platný výraz?

Výrazy mohou zahrnovat cesty polí, literály, systémové proměnné, objekty výrazů a výrazové operátory. Výrazy lze vnořovat.

Chceme tedy použít výrazový operátor, ale jak můžete vidět z dokumentu $elemMatch není jeho součástí. proto to není platný výraz pro použití v agregaci $project fázi.



  1. mongodb:vložte, pokud neexistuje

  2. MongoDB:Server má varování při spuštění

  3. Jak mohu spustit MongoDB jako službu Windows?

  4. Bůh konfigurační soubor pro sledování stávajících procesů?