Definição
Retorna um documento criado combinando os documentos de entrada de cada grupo.
O acumulador $mergeObjects está disponível nos seguintes estágios:
Observação
Desambiguação
Esta página descreve $mergeObjects quando usado como acumulador. Os acumuladores retornam um valor agregado em um grupo de documentos de entrada.
Você também pode usar $mergeObjects nestes outros contextos:
$mergeObjects (expression), que mescla uma array de documentos em um único documento.$mergeObjects (window function), que é usado no estágio$setWindowFieldspara retornar um documento mesclado de documentos em uma janela.
Sintaxe
{ $mergeObjects: <expression> }
O <expression> pode ser qualquer expressão válida que avalia para um documento.
Comportamento
$mergeObjects ignora valores de entrada null. Se todos os valores de entrada forem null, $mergeObjects retornará um documento vazio { }.
$mergeObjects substitui os valores dos campo à medida que mescla documentos. Se vários documentos de entrada contiverem o mesmo nome de campo , a saída conterá o valor do último documento de entrada que contém o campo conflitante.
Exemplo
Crie uma coleção movieReviews:
db.movieReviews.insertMany( [ { title: "Galactic Odyssey", source: "filmCritic", data: { rating: 8.1, votes: 1482903 } }, { title: "Galactic Odyssey", source: "viewerVault", data: { tomatometer: 79, audienceScore: 85 } }, { title: "Neon Horizon", source: "filmCritic", data: { rating: 7.4, votes: 983201 } }, { title: "Neon Horizon", source: "viewerVault", data: { tomatometer: 68, audienceScore: 74 } }, { title: "The Last Protocol", source: "filmCritic", data: { rating: 8.7, votes: 2104567 } }, { title: "The Last Protocol", source: "viewerVault", data: { tomatometer: 91, audienceScore: 88 } } ] )
Cada filme tem dois documentos:
Um do filme Critic com os campos
ratingevotes.Um do viewerVault com os campos
tomatometereaudienceScore.
Como os dois documentos de origem têm nomes de campo diferentes, $mergeObjects pode combiná-los em um perfil completo que inclua todos os quatro campos.
O pipeline a seguir usa $mergeObjects em um estágio $group para combinar os dados de revisão de cada fonte em um único documento para cada filme:
db.movieReviews.aggregate( [ { $group: { _id: "$title", allRatings: { $mergeObjects: "$data" } } }, { $sort: { _id: 1 } } ] )
No pipeline anterior:
$groupagrupa documentos portitlee usa$mergeObjectspara mesclar os subdocumentosdatade cada fonte. Como os documentos FilmeCritic e ViewerVault contêm nomes de campo diferentes, o resultado mesclado inclui todos os campos de ambas as fontes.$sortordena os resultados alfabeticamente por título.