sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo usar $ elemMatch en la proyección de agregados?

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.