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.