Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$arrayToObject (operador de expresión)

$arrayToObject

Convierte una matriz en un solo documento.

$arrayToObject tiene la siguiente sintaxis:

{ $arrayToObject: <expression> }

El <expression> puede ser cualquier valido expresión que se resuelve en:

  • Una matriz de matrices de dos elementos donde el primer elemento es el nombre del campo y el segundo elemento es el valor del campo:

    $arrayToObject: [
    [ [ "item", "abc123" ], [ "qty", 25 ] ]
    ]

-O-

  • Un arreglo de documentos que contiene dos campos, k y v, donde:

    • El campo k contiene el nombre del campo.

    • El campo v contiene el valor del campo.

    $arrayToObject: [
    [
    { "k": "item", "v": "abc123" },
    { "k": "qty", "v": 25 }
    ]
    ]

Si se pasa un arreglo vacío a $arrayToObject, MongoDB crea un objeto vacío.

Si el nombre de un campo se repite en la matriz,

  • A partir de 4.0.5, $arrayToObject utiliza el último valor para ese campo. Para el rango 4.0.0-4.0.4, el valor utilizado depende del controlador.

  • A partir 3.6.10 de, usa el último valor de ese campo. $arrayToObject Para 3.6.0-..,3 69el valor usado depende del controlador.

  • A partir de 3.4.19, $arrayToObject usa el último valor para ese campo. Para 3.4.0-3.4.19, el uso del valor depende del controlador.

Ejemplo
Resultados
{ $arrayToObject: [
[ { "k": "item", "v": "abc123" },
{ "k": "qty", "v": "$qty" } ]
] }

Dado un documento con el campo qty y el valor 25, $arrayToObject devuelve:

{ "item" : "abc123", "qty" : 25 }
{ $arrayToObject: { $literal: [
[ "item", "abc123" ], [ "qty", 25 ]
] } }
{ "item" : "abc123", "qty" : 25 }
{ $arrayToObject: { $literal: [
{ "k": "item", "v": "123abc" },
{ "k": "item", "v": "abc123" }
] } }
{ "item" : "abc123" }

A partir de la versión 4.0.5+ (3.6.10+ y 3.4.19+), si el nombre de un campo se repite en el arreglo, $arrayToObject utiliza el último valor para ese campo.

Considera una colección inventory con los siguientes documentos:

db.inventory.insertMany( [
{ _id: 1, item: "ABC1", dimensions: [ { "k": "l", "v": 25} , { "k": "w", "v": 10 }, { "k": "uom", "v": "cm" } ] },
{ _id: 2, item: "ABC2", dimensions: [ [ "l", 50 ], [ "w", 25 ], [ "uom", "cm" ] ] },
{ _id: 3, item: "ABC3", dimensions: [ [ "l", 25 ], [ "l", "cm" ], [ "l", 50 ] ] }
] )

La siguiente operación de pipeline de agregación utiliza el $arrayToObject para devolver el campo dimensions como un documento:

db.inventory.aggregate(
[
{
$project: {
item: 1,
dimensions: { $arrayToObject: "$dimensions" }
}
}
]
)

La operación devuelve lo siguiente:

{ _id: 1, item: "ABC1", dimensions: { "l" : 25, "w" : 10, "uom" : "cm" } }
{ _id: 2, item: "ABC2", dimensions: { "l" : 50, "w" : 25, "uom" : "cm" } }
{ _id: 3, item: "ABC3", dimensions: { "l" : 50 } }

A partir de las versiones 4.0.5+ (3.6.10+ y 3.4.19+), si el nombre de un campo se repite en la matriz, $arrayToObject utiliza el último valor de ese campo.

Considera una colección inventory con los siguientes documentos:

db.inventory.insertMany( [
{ _id: 1, item: "ABC1", instock: { warehouse1: 2500, warehouse2: 500 } },
{ _id: 2, item: "ABC2", instock: { warehouse2: 500, warehouse3: 200},
}
] )

La siguiente operación de la pipeline de agregación calcula el Stock total para cada artículo y lo añade al documento instock:

db.inventory.aggregate( [
{ $addFields: { instock: { $objectToArray: "$instock" } } },
{ $addFields: { instock: { $concatArrays: [ "$instock", [ { "k": "total", "v": { $sum: "$instock.v" } } ] ] } } } ,
{ $addFields: { instock: { $arrayToObject: "$instock" } } }
] )

La operación devuelve lo siguiente:

{ _id: 1, item: "ABC1", instock: { warehouse1: 2500, warehouse2: 500, total: 3000 } }
{ _id: 2, item: "ABC2", instock: { warehouse2: 500, warehouse3: 200, total: 700 } }

Tip

Volver

$arrayElemAt

En esta página