MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come utilizzare $ elemMatch sulla proiezione dell'aggregato?

Abbastanza su una vecchia domanda, ma letteralmente nessuna delle risposte proposte è buona.

TLDR :

Non puoi usare $elemMatch in una fase di $progetto. ma puoi ottenere lo stesso risultato usando altri operatori di aggregazione come $filter.

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

E se vuoi solo il primo elemento dell'array che corrisponda alla condizione in modo simile a quello che fa $elemMatch puoi incorporare $arrayElemAt

Spiegazione approfondita :

Per prima cosa capiamo $elemMatch:

$elemMatch è un'espressione di query mentre esiste anche questa versione di proiezione, si riferisce a una proiezione di query e non a una fase di aggregazione $progetto.

E allora? cosa c'entra questo con qualcosa? beh, una fase del $progetto ha una certa struttura di input che può avere mentre quella che vogliamo usare è:

:

Che cos'è un'espressione valida?

Le espressioni possono includere percorsi di campo, valori letterali, variabili di sistema, oggetti espressione e operatori di espressione. Le espressioni possono essere nidificate.

Quindi vogliamo usare un operatore di espressione, ma come puoi vedere dal documento $elemMatch non ne fa parte. quindi non è un'espressione valida da usare in un'aggregazione $project fase.