Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$arrayToObject (agregação)

Nesta página

  • Definição
  • Comportamento
  • Exemplos
$arrayToObject

Converte uma array em um único documento; a array deve ser:

  • Uma array de arrays de dois elementos onde o primeiro elemento é o nome do campo e o segundo elemento é o valor do campo:

    [ [ [ "item", "abc123" ], [ "qty", 25 ] ] ]

- OU -

  • Uma array de documentos que contém dois campos, k e v, onde:

    • O campo k contém o nome do campo.

    • O campo v contém o valor do campo.

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

$arrayToObject tem a seguinte sintaxe:

{ $arrayToObject: <expression> }

O <expression> pode ser qualquerexpressão válida que resolva para uma array de arrays de dois elementos ou array de documentos que contém campos "k" e "v".

Para mais informações sobre expressões, consulte Operadores de Expressão.

Se o nome de um campo se repetir na array,

  • A partir de 4.0.5, $arrayToObject utiliza o último valor para este campo. Para 4.0.0-4.0.4, o valor utilizado depende do driver.

  • A partir de 3.6.10, $arrayToObject utiliza o último valor para este campo. Para 3.6.0-3.6.9, o valor utilizado depende do driver.

  • A partir de 3.4.19, $arrayToObject utiliza o último valor para este campo. Para 3.4.0-3.4.19, o valor utilizado depende do driver.

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

Dado um documento com o campo qty e o 25 valor, $arrayToObject retorna:

{ "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 das versões 4.0.5+ (3.6.10+ e 3.4.19+), se o nome de um campo se repetir na array, usará o último valor desse$arrayToObject campo.

Considere uma collection inventory com os seguintes documentos:

{ "_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 ] ] }

A seguinte operação de pipeline de agregação utiliza o $arrayToObject para retornar o campo dimensions como um documento:

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

A operação retorna o seguinte:

{ "_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 } }

Começando nas versões 4.0.5+ (3.6.10+ e 3.4.19+), se o nome de um campo se repetir na array, $arrayToObject usará o último valor desse campo.

Considere uma collection inventory com os seguintes documentos:

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

A seguinte operação de aggregation pipeline calcula o total em estoque para cada item e adiciona ao documento instock:

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

A operação retorna o seguinte:

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

Dica

Veja também:

Voltar

$arrayElemAt