Definición
$arrayToObjectConvierte una matriz en un solo documento.
$arrayToObjecttiene la siguiente sintaxis:{ $arrayToObject: <expression> } El
<expression>puede ser cualquier valor válido 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-
Una matriz de documentos que contiene dos campos,
kyv, donde:El campo
kcontiene el nombre del campo.El campo
vcontiene el valor del campo.
$arrayToObject: [ [ { "k": "item", "v": "abc123" }, { "k": "qty", "v": 25 } ] ]
Comportamiento
Si pasa una matriz vacía 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,
$arrayToObjectSe utiliza el último valor de ese campo. Para 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.
$arrayToObjectPara 3.6.0-..,3 69el valor usado depende del controlador.A partir 3.4.19 de, usa el último valor de ese campo.
$arrayToObjectPara 3.4.0-..,3 419el valor usado depende del controlador.
Ejemplo | Resultados | |||||
|---|---|---|---|---|---|---|
| Dado un documento con el campo | |||||
| | |||||
| 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, |
Ejemplos
$arrayToObject Ejemplo
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 canalización de agregación utiliza para devolver $arrayToObject el dimensions campo 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.
$objectToArray + $arrayToObject Ejemplo
Considere 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 canalización de agregación calcula el total en stock para cada artículo y lo agrega 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 } }