Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

$unwind (etapa de agregación)

$unwind

Descompone un campo de arreglo de los documentos de entrada para producir un documento para cada elemento. Cada documento de salida es el documento de entrada con el valor del campo del arreglo reemplazado por el elemento.

Puedes usar $unwind para implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente administrado para implementaciones de MongoDB en la nube.
  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

Pase un operando de ruta de campo o un operando de documento para descomponer un campo de arreglo.

Puedes pasar la ruta de campo del arreglo a $unwind. Con esta sintaxis, $unwind no genera un documento si el valor del campo es nulo, está ausente o es un arreglo vacío.

{ $unwind: <field path> }

Cuando especifiques la ruta de campo, antepón el nombre del campo con un signo de dólar $ y enciérralo entre comillas.

Puedes pasar un documento a $unwind para especificar opciones.

{
$unwind:
{
path: <field path>,
includeArrayIndex: <string>,
preserveNullAndEmptyArrays: <boolean>
}
}
Campo
Tipo
Descripción

string

Ruta de campo a un campo de arreglo. Para especificar una ruta de campo, anteponer el nombre del campo con un signo de dólar $ y encerrarlo entre comillas.

string

Opcional. El nombre de un nuevo campo para contener el índice del arreglo del elemento. El nombre no puede comenzar con un signo de dólar $.

booleano

Opcional.

  • Si true, si path falta o es un arreglo vacío, $unwind omite el campo de salida del documento de salida. Si el valor es null, el campo permanece null.

  • Si false, si path es nulo, falta o es un arreglo vacío, $unwind no genera un documento.

El valor por defecto es false.

Cuando el valor en path no se resuelve en un arreglo, $unwind se comporta de la siguiente manera:

  • Si el valor no falta, no es null y no es un arreglo vacío, $unwind genera un solo documento utilizando el valor tal cual.

  • Si includeArrayIndex se especifica, el índice es 0 para entradas de arreglos y null para entradas que no sean de arreglos. Los documentos posteriores en la lista tienen un índice superior a 0.

  • Si falta el valor, null, o si la matriz está vacía, $unwind sigue a la opción preserveNullAndEmptyArrays. Cuando se especifica includeArrayIndex y se conserva el documento, el índice esnull.

Si especificas una ruta para un campo que no existe en un documento de entrada o el campo es un arreglo vacío, $unwind, por defecto, ignora el documento de entrada y no se generarán documentos para ese documento de entrada.

Para generar documentos donde el campo de matriz no esté presente, sea nulo o sea una matriz vacía, utilice la opción preserveNullAndEmptyArrays.

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 la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si realizó alguna modificación en las bases de datos de muestra, es posible que deba descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.

La siguiente agregación utiliza la etapa $unwind para generar un documento por cada elemento del arreglo genres del documento de película Inception:

db.movies.aggregate( [
{ $match: { title: "Inception" } },
{ $project: { _id: 0, title: 1, genres: 1 } },
{ $unwind: "$genres" }
] )
[
{
genres: 'Action',
title: 'Inception'
},
{
genres: 'Mystery',
title: 'Inception'
},
{
genres: 'Sci-Fi',
title: 'Inception'
}
]

Cada documento de salida es idéntico al documento de entrada, excepto por el valor del campo genres, que ahora contiene un solo elemento del arreglo genres original.

La siguiente agregación utiliza la etapa $unwind con cuatro documentos de películas. Dos de los documentos ("La porta del cielo" y "Neecha Nagar") no tienen un campo genres:

db.movies.aggregate( [
{
$match: {
title: {
$in: [
"Inception",
"Brave",
"La porta del cielo",
"Neecha Nagar"
]
}
}
},
{ $project: { _id: 0, title: 1, genres: 1 } },
{ $unwind: { path: "$genres" } }
] )
[
{
genres: 'Animation',
title: 'Brave'
},
{
genres: 'Adventure',
title: 'Brave'
},
{
genres: 'Comedy',
title: 'Brave'
},
{
genres: 'Action',
title: 'Inception'
},
{
genres: 'Mystery',
title: 'Inception'
},
{
genres: 'Sci-Fi',
title: 'Inception'
}
]
  • En los documentos "Brave" y "Inception", genres es un arreglo poblado. $unwind devuelve un documento para cada elemento.

  • Los documentos "La porta del cielo" y "Neecha Nagar" no tienen un campo genres, por lo tanto, $unwind no devuelve ningún documento para ellos.

Nota

La sintaxis { path: <FIELD> } es opcional. Las siguientes $unwind operaciones son equivalentes.

db.<COLLECTION>.aggregate(
[ { $unwind: "<FIELD>" } ]
)
db.<COLLECTION>.aggregate(
[ { $unwind: { path: "<FIELD>" } } ]
)

Los ejemplos preserveNullAndEmptyArrays e includeArrayIndex utilizan documentos de la colección sample_mflix.movies.

La siguiente operación $unwind utiliza la opción preserveNullAndEmptyArrays para incluir documentos cuyo campo genres no está presente.

db.movies.aggregate( [
{
$match: {
title: {
$in: [
"Inception",
"Brave",
"La porta del cielo",
"Neecha Nagar"
]
}
}
},
{ $project: { _id: 0, title: 1, genres: 1 } },
{
$unwind: {
path: "$genres",
preserveNullAndEmptyArrays: true
}
}
] )
[
{
title: 'La porta del cielo'
},
{
title: 'Neecha Nagar'
},
{
genres: 'Animation',
title: 'Brave'
},
{
genres: 'Adventure',
title: 'Brave'
},
{
genres: 'Comedy',
title: 'Brave'
},
{
genres: 'Action',
title: 'Inception'
},
{
genres: 'Mystery',
title: 'Inception'
},
{
genres: 'Sci-Fi',
title: 'Inception'
}
]

La siguiente operación $unwind utiliza la opción includeArrayIndex para incluir el índice de la matriz en la salida.

db.movies.aggregate( [
{ $match: { title: "Inception" } },
{ $project: { _id: 0, title: 1, genres: 1 } },
{
$unwind: {
path: "$genres",
includeArrayIndex: "genreIndex"
}
}
] )
[
{
genres: 'Action',
title: 'Inception',
genreIndex: Long('0')
},
{
genres: 'Mystery',
title: 'Inception',
genreIndex: Long('1')
},
{
genres: 'Sci-Fi',
title: 'Inception',
genreIndex: Long('2')
}
]

El siguiente pipeline desenrolla el arreglo genres y agrupa los documentos resultantes por género para contar el número de películas en cada género:

db.movies.aggregate( [
// First Stage
{
$match: {
title: {
$in: [
"The Dark Knight",
"Inception",
"Interstellar",
"Brave"
]
}
}
},
// Second Stage
{ $project: { _id: 0, title: 1, genres: 1 } },
// Third Stage
{ $unwind: "$genres" },
// Fourth Stage
{
$group: {
_id: "$genres",
movieCount: { $sum: 1 }
}
},
// Fifth Stage
{ $sort: { movieCount: -1 } }
] )
[
{
_id: 'Adventure',
movieCount: 2
},
{
_id: 'Action',
movieCount: 2
},
{
_id: 'Drama',
movieCount: 2
},
{
_id: 'Sci-Fi',
movieCount: 2
},
{
_id: 'Crime',
movieCount: 1
},
{
_id: 'Animation',
movieCount: 1
},
{
_id: 'Comedy',
movieCount: 1
},
{
_id: 'Mystery',
movieCount: 1
}
]

Puede aplicar $unwind múltiples veces en un solo pipeline para expandir documentos que contienen varios campos de arreglo. La siguiente operación desenrolla el arreglo genres y luego el arreglo cast para producir un documento plano para cada combinación de género y actor, luego agrupa por género para contar el total de apariciones del elenco en cada género:

db.movies.aggregate( [
// First Stage
{
$match: {
title: {
$in: [ "Inception", "The Dark Knight", "Interstellar" ]
}
}
},
// Second Stage
{ $project: { _id: 0, title: 1, genres: 1, cast: 1 } },
// Third Stage
{ $unwind: "$genres" },
// Fourth Stage
{ $unwind: "$cast" },
// Fifth Stage
{
$group: {
_id: "$genres",
castAppearances: { $sum: 1 }
}
}
] )
[
{
_id: 'Adventure',
castAppearances: 4
},
{
_id: 'Crime',
castAppearances: 4
},
{
_id: 'Action',
castAppearances: 8
},
{
_id: 'Drama',
castAppearances: 8
},
{
_id: 'Mystery',
castAppearances: 4
},
{
_id: 'Sci-Fi',
castAppearances: 8
}
]

Para ver las etapas y expresiones relacionadas, consulte $group, $sum, $sort y $multiply.

Para ver un ejemplo completo, consulta el tutorial descomponer arreglos y agrupar datos.