Une vieille question, mais littéralement aucune des réponses proposées n'est bonne.
TLDR :
Vous ne pouvez pas utiliser $elemMatch dans une étape $project. mais vous pouvez obtenir le même résultat en utilisant d'autres opérateurs d'agrégation comme $filter.
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
Et si vous voulez juste le premier élément du tableau qui correspond à la condition de la même manière que $elemMatch, vous pouvez incorporer $arrayElemAt
Explication détaillée :
Commençons par comprendre $elemMatch :
$elemMatch est une expression de requête alors que cette version de projection existe également, cela fait référence à une projection de requête et non à une étape d'agrégation de $project.
Et alors? qu'est-ce que cela a à voir avec quoi que ce soit? eh bien, une étape de $project a une certaine structure d'entrée qu'elle peut avoir alors que celle que nous voulons utiliser est :
:
Qu'est-ce qu'une expression valide ?
Les expressions peuvent inclure des chemins de champ, des littéraux, des variables système, des objets d'expression et des opérateurs d'expression. Les expressions peuvent être imbriquées.
Nous voulons donc utiliser un opérateur d'expression, mais comme vous pouvez le voir dans le document $elemMatch
n'en fait pas partie. par conséquent, ce n'est pas une expression valide à utiliser dans une agrégation $project
scène.