$objectToArray (agregação)
Definição
$objectToArray
Converte um documento em uma array. A array de devolução contém um elemento para cada par de campo/valor no documento original. Cada elemento na array de devolução é um documento que contém dois campos
k
ev
:O campo
k
contém o nome do campo no documento original.O campo
v
contém o valor do campo no documento original.
$objectToArray
tem a seguinte sintaxe:{ $objectToArray: <object> } A expressão
<object>
pode ser qualquer expressão válida, desde que se resolva em um objeto de documento.$objectToArray
se aplica aos campos de nível superior do argumento. Se o argumento é um documento que contém campos de documento incorporado,$objectToArray
não se aplica recursivamente aos campos de documento incorporado.Para mais informações sobre expressões, consulte Operadores de Expressão.
Comportamento
Para mais informações sobre expressões, consulte Operadores de Expressão.
Exemplo | Resultados | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||||
|
|
Exemplos
$objectToArray
Exemplo
Considere uma collection inventory
com os seguintes documentos:
db.inventory.insertMany( [ { _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: "XYZ1", dimensions: { l: 70, w: 75, uom: "cm" } } ] )
A operação de pipeline de agregação a seguir usa $objectToArray
para retornar o campo dimensions
como array:
db.inventory.aggregate( [ { $project: { item: 1, dimensions: { $objectToArray: "$dimensions" } } } ] )
A operação retorna o seguinte:
{ _id: 1, item: "ABC1", dimensions: [ { "k" : "l", "v" : 25 }, { "k" : "w", "v" : 10 }, { "k" : "uom", "v" : "cm" } ] } { _id: 2, item: "ABC2", dimensions: [ { "k" : "l", "v" : 50 }, { "k" : "w", "v" : 25 }, { "k" : "uom", "v" : "cm" } ] } { _id: 3, item: "XYZ1", dimensions: [ { "k" : "l", "v" : 70 }, { "k" : "w", "v" : 75 }, { "k" : "uom", "v" : "cm" } ] }
$objectToArray
para somar campos aninhados
Considere uma collection inventory
com os seguintes documentos:
db.inventory.insertMany( [ { _id: 1, item: "ABC1", instock: { warehouse1: 2500, warehouse2: 500 } } { _id: 2, item: "ABC2", instock: { warehouse2: 500, warehouse3: 200} } ] )
A operação de pipeline de agregação a seguir usa $objectToArray
junto com $unwind
e $group
para calcular o total de itens em estoque por armazém.
db.inventory.aggregate([ { $project: { warehouses: { $objectToArray: "$instock" } } }, { $unwind: "$warehouses" }, { $group: { _id: "$warehouses.k", total: { $sum: "$warehouses.v" } } } ])
A operação retorna o seguinte:
{ _id: "warehouse3", total: 200 } { _id: "warehouse2", total: 1000 } { _id: "warehouse1", total: 2500 }
$objectToArray
+ $arrayToObject
exemplo
Considere uma collection inventory
com os seguintes documentos:
db.inventory.insertMany( [ { _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 } }
Veja também: