Docs Menu
Docs Home
/ /
Operadores de tuberías de agregación

$zip (agregación)

$zip

Transpone una matriz de matrices de entrada de modo que el primer elemento de la matriz de salida sea una matriz que contenga el primer elemento de la primera matriz de entrada, el primer elemento de la segunda matriz de entrada, etc.

Por ejemplo, $zip transformaría [ [ 1, 2, 3 ], [ "a", "b", "c" ] ] en [ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ] ].

$zip tiene la siguiente sintaxis:

{
$zip: {
inputs: [ <array expression1>, ... ],
useLongestLength: <boolean>,
defaults: <array expression>
}
}
Operando
Descripción

inputs

Una variedad de Expresiones que se resuelven en matrices. Los elementos de estas matrices de entrada se combinan para formar las matrices de la matriz de salida.

Si alguna de las inputs matrices se resuelve en un valor de null o hace referencia a un campo faltante, $zip nulldevuelve.

Si alguna de las inputs matrices no se resuelve en una matriz o null ni hace referencia a un campo faltante, devuelve un$zip error.

useLongestLength

Un valor booleano que especifica si la longitud de la matriz más larga determina la cantidad de matrices en la matriz de salida.

El valor predeterminado es false: la longitud de matriz más corta determina la cantidad de matrices en la matriz de salida.

defaults

Una matriz de valores de elementos predeterminados que se usará si las matrices de entrada tienen longitudes diferentes. Debe especificar useLongestLength: true junto con este campo; de lo contrario,$zip devolverá un error.

Si useLongestLength: true pero defaults está vacío o no se especifica, $zip usa null como valor predeterminado.

Si se especifica un no defaults vacío, debe especificar un valor predeterminado para cada matriz de entrada o, de lo $zip contrario, devolverá un error.

Las matrices de entrada no necesitan tener la misma longitud. De forma predeterminada, la matriz de salida tiene la longitud de la matriz de entrada más corta, pero la useLongestLength opción indica a que genere una matriz con la $zip misma longitud que la matriz de entrada más larga.

Ejemplo
Resultados
{ $zip: { inputs: [ [ "a" ], [ "b" ], [ "c" ] ] }
[ [ "a", "b", "c" ] ]
{ $zip: { inputs: [ [ "a" ], [ "b", "c" ] ] } }
[ [ "a", "b" ] ]
{
$zip: {
inputs: [ [ 1 ], [ 2, 3 ] ],
useLongestLength: true
}
}
[ [ 1, 2 ], [ null, 3 ] ]
{
$zip: {
inputs: [ [ 1 ], [ 2, 3 ], [ 4 ] ],
useLongestLength: true,
defaults: [ "a", "b", "c" ]
}
}

Debido a que useLongestLength: true, $zip rellenará las matrices de entrada más cortas con los elementos defaults correspondientes.

Esto produce [ [ 1, 2, 4 ], [ "a", 3, "c" ] ].

Una colección llamada matrices contiene los siguientes documentos:

db.matrices.insertMany([
{ matrix: [[1, 2], [2, 3], [3, 4]] },
{ matrix: [[8, 7], [7, 6], [5, 4]] },
])

Para calcular la transposición de cada matriz 3x2 en esta colección, puede utilizar la siguiente operación de agregación:

db.matrices.aggregate([{
$project: {
_id: false,
transposed: {
$zip: {
inputs: [
{ $arrayElemAt: [ "$matrix", 0 ] },
{ $arrayElemAt: [ "$matrix", 1 ] },
{ $arrayElemAt: [ "$matrix", 2 ] },
]
}
}
}
}])

Esto devolverá las siguientes matrices 2x3:

{ "transposed" : [ [ 1, 2, 3 ], [ 2, 3, 4 ] ] }
{ "transposed" : [ [ 8, 7, 5 ], [ 7, 6, 4 ] ] }

Puede utilizar $zip con para obtener un subconjunto de elementos en una matriz, guardando el índice original junto con cada elemento $filter retenido.

Una colección llamada pages contiene el siguiente documento:

db.pages.save( {
"category": "unix",
"pages": [
{ "title": "awk for beginners", reviews: 5 },
{ "title": "sed for newbies", reviews: 0 },
{ "title": "grep made simple", reviews: 2 },
] } )

La siguiente secuencia de agregación primero comprimirá los elementos de la matriz pages junto con su índice y luego filtrará solo las páginas con al menos una reseña:

db.pages.aggregate([{
$project: {
_id: false,
pages: {
$filter: {
input: {
$zip: {
inputs: [ "$pages", { $range: [0, { $size: "$pages" }] } ]
}
},
as: "pageWithIndex",
cond: {
$let: {
vars: {
page: { $arrayElemAt: [ "$$pageWithIndex", 0 ] }
},
in: { $gte: [ "$$page.reviews", 1 ] }
}
}
}
}
}
}])

Esto devolverá el siguiente documento:

{
"pages" : [
[ { "title" : "awk for beginners", "reviews" : 5 }, 0 ],
[ { "title" : "grep made simple", "reviews" : 2 }, 2 ] ]
}

Volver

$year

En esta página