Una pregunta bastante antigua, pero literalmente ninguna de las respuestas propuestas es buena.
TLDR :
No puede usar $elemMatch en una etapa de $proyecto. pero puede lograr el mismo resultado usando otros operadores de agregación como $filter.
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
Y si desea solo el primer elemento de la matriz que coincida con la condición de manera similar a lo que hace $elemMatch, puede incorporar $arrayElemAt
Explicación detallada :
Primero entendamos $elemMatch:
$elemMatch es una expresión de consulta, mientras que también existe esta versión de proyección que se refiere a una proyección de consulta y no a una etapa de agregación de $proyecto.
¿Así que lo que? ¿Qué tiene esto que ver con nada? bueno, una etapa de $proyecto tiene cierta estructura de entrada que puede tener, mientras que la que queremos usar es:
¿Qué es una expresión válida?
Las expresiones pueden incluir rutas de campo, literales, variables del sistema, objetos de expresión y operadores de expresión. Las expresiones se pueden anidar.
Así que queremos usar un operador de expresión, pero como puede ver en el documento $elemMatch
no es parte de eso. por lo tanto, no es una expresión válida para usar en una agregación $project
escenario.