Definición
Devuelve el resultado de una expresión para el primer documento en un grupo de documentos. Solo es significativo cuando los documentos están en un orden definido.
El acumulador $first está disponible en estas etapas:
Nota
Desambiguación
Esta página describe $first cuando se utiliza como acumulador. Los acumuladores devuelven un único valor agregado, como la suma, el máximo o el mínimo, de un grupo de documentos de entrada.
También puedes usar $first en estos otros contextos:
$first (expression), que devuelve el primer elemento de una matriz.$first (window function), que se utiliza en la etapa$setWindowFieldspara devolver un valor para el primer documento en una ventana.
Sintaxis
{ $first: <expression> }
Comportamiento
Definir orden de documentos
Para definir el orden de los documentos para $first en una etapa de agrupación, agregue una etapa $sort precedente.
Valores ausentes
Es posible que a los documentos de un grupo les falten campos. $first gestiona los valores faltantes de la siguiente manera:
Si no hay documentos de la etapa de pipeline anterior, la etapa
$groupno devuelve nada.Si falta el campo en procesamiento por parte del acumulador de
$first,$firstdevuelvenull.
Por ejemplo, considere los siguientes documentos en la colección badData, donde a algunos documentos les faltan campos:
db.badData.insertMany( [ { "_id": 1, "price": 6, "quantity": 6 }, { "_id": 2, "item": "album", "price": 5, "quantity": 5 }, { "_id": 7, "item": "tape", "price": 6, "quantity": 6 }, { "_id": 8, "price": 5, "quantity": 5 }, { "_id": 9, "item": "album", "price": 3, "quantity": '' }, { "_id": 10, "item": "tape", "price": 3, "quantity": 4 }, { "_id": 12, "item": "cd", "price": 7 } ] )
Se puede hacer un query a la colección badData, agrupando la salida en el campo item:
db.badData.aggregate( [ { $sort: { item: 1, price: 1 } }, { $group: { _id: "$item", inStock: { $first: "$quantity" } } } ] )
$first Selecciona el primer documento de cada grupo de salida. Los documentos que no tienen el campo item se agrupan con un valor null para el campo _id. Cuando falta el campo acumulador (quantity en este ejemplo), $first devuelve null.
Ejemplos
Los ejemplos de esta página utilizan datos del conjunto de datos sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación autogestionada de MongoDB, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.
El siguiente ejemplo ordena las películas por año y título, y luego las agrupa por género para encontrar la primera película estrenada en cada género:
db.movies.aggregate( [ { $sort: { year: 1, title: 1 } }, { $unwind: "$genres" }, { $group: { _id: "$genres", firstMovieTitle: { $first: "$title" }, firstMovieYear: { $first: "$year" } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
En el pipeline anterior:
$sortordena las películas poryearen orden ascendente, luegotitleen orden alfabético.$unwindcrea un documento separado para cada género en el arraygenres, manteniendo el orden de clasificación establecido por la etapa anterior.$groupcon$firstdevuelve eltitley elyearde la primera película (la más antigua por año, luego alfabéticamente por título) para cada género.Un segundo
$sortordena los resultados alfabéticamente por género.$limitrestringe la salida a los géneros 5.