Definición
$zipTranspone 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,
$ziptransformaría[ [ 1, 2, 3 ], [ "a", "b", "c" ] ][ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ] ]en.$ziptiene la siguiente sintaxis:{ $zip: { inputs: [ <array expression1>, ... ], useLongestLength: <boolean>, defaults: <array expression> } } OperandoDescripcióninputsUna 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
inputsmatrices se resuelve en un valor denullo hace referencia a un campo faltante,$zipnulldevuelve.Si alguna de las
inputsmatrices no se resuelve en una matriz onullni hace referencia a un campo faltante, devuelve un$ziperror.useLongestLengthUn 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.defaultsUna matriz de valores de elementos predeterminados que se usará si las matrices de entrada tienen longitudes diferentes. Debe especificar
useLongestLength: truejunto con este campo; de lo contrario,$zipdevolverá un error.Si
useLongestLength: trueperodefaultsestá vacío o no se especifica,$zipusanullcomo valor predeterminado.Si se especifica un no
defaultsvacío, debe especificar un valor predeterminado para cada matriz de entrada o, de lo$zipcontrario, devolverá un error.
Comportamiento
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 | |||||||
|---|---|---|---|---|---|---|---|---|
| | |||||||
| | |||||||
| | |||||||
| Debido a que Esto produce |
Ejemplo
Transposición de matrices
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 ] ] }
Filtrado y conservación de índices
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.insertOne( { "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 ] ] }