$mergeObjects (agregação)
Nesta página
Definição
Combina vários documentos em um único documento.
$mergeObjects
está disponível nestes estágios:
Sintaxe
Quando usado como acumulador de estágio $bucket
, $bucketAuto
ou $group
, $mergeObjects
tem esta sintaxe:
{ $mergeObjects: <document> }
Quando usado em outras expressões (incluindo nos estágios $bucket
, $bucketAuto
e $group
), mas não como acumuladores, $mergeObjects
tem esta sintaxe:
{ $mergeObjects: [ <document1>, <document2>, ... ] }
<document>
pode ser qualquer expressão válida que se resolva em um documento.
Comportamento
$mergeObjects
ignora null
operandos. Se todos os operandos para $mergeObjects
forem resolvidos como nulo, $mergeObjects
retornará um documento { }
vazio.
$mergeObjects
substitui os valores dos campos à medida que mescla os documentos. Se os documentos a serem mesclados incluírem o mesmo nome de campo, o campo, no documento resultante, terá o valor do último documento mesclado para o campo.
Exemplo | Resultados | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
| ||||||||
|
| ||||||||
|
| ||||||||
|
|
Exemplos
$mergeObjects
Crie uma collection orders
com os seguintes documentos:
db.orders.insertMany( [ { "_id" : 1, "item" : "abc", "price" : 12, "ordered" : 2 }, { "_id" : 2, "item" : "jkl", "price" : 20, "ordered" : 1 } ] )
Crie outra collection items
com os seguintes documentos:
db.items.insertMany( [ { "_id" : 1, "item" : "abc", description: "product 1", "instock" : 120 }, { "_id" : 2, "item" : "def", description: "product 2", "instock" : 80 }, { "_id" : 3, "item" : "jkl", description: "product 3", "instock" : 60 } ] )
A operação a seguir usa primeiro o estágio $lookup
para unir as duas coleções pelos campos item
e, em seguida, usa $mergeObjects
no $replaceRoot
para mesclar os documentos unidos de items
e orders
:
db.orders.aggregate( [ { $lookup: { from: "items", localField: "item", // field in the orders collection foreignField: "item", // field in the items collection as: "fromItems" } }, { $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$fromItems", 0 ] }, "$$ROOT" ] } } }, { $project: { fromItems: 0 } } ] )
A operação retorna os seguintes documentos:
{ _id: 1, item: 'abc', description: 'product 1', instock: 120, price: 12, ordered: 2 }, { _id: 2, item: 'jkl', description: 'product 3', instock: 60, price: 20, ordered: 1 }
$mergeObjects
como accumulator
Crie uma collection sales
com os seguintes documentos:
db.sales.insertMany( [ { _id: 1, year: 2017, item: "A", quantity: { "2017Q1": 500, "2017Q2": 500 } }, { _id: 2, year: 2016, item: "A", quantity: { "2016Q1": 400, "2016Q2": 300, "2016Q3": 0, "2016Q4": 0 } } , { _id: 3, year: 2017, item: "B", quantity: { "2017Q1": 300 } }, { _id: 4, year: 2016, item: "B", quantity: { "2016Q3": 100, "2016Q4": 250 } } ] )
A operação a seguir usa $mergeObjects
como acumulador em um estágio $group
que agrupa documentos pelo campo item
:
Observação
Quando usado como acumulador, o operador $mergeObjects
aceita um único operando.
db.sales.aggregate( [ { $group: { _id: "$item", mergedSales: { $mergeObjects: "$quantity" } } } ] )
A operação retorna os seguintes documentos:
{ _id: 'A', mergedSales: { '2017Q1': 500, '2017Q2': 500, '2016Q1': 400, '2016Q2': 300, '2016Q3': 0, '2016Q4': 0 } }, { _id: 'B', mergedSales: { '2017Q1': 300, '2016Q3': 100, '2016Q4': 250 } }
Observação
Se os documentos a serem mesclados incluírem o mesmo nome de campo, o campo, no documento resultante, terá o valor do último documento mesclado para o campo.