Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Menu Docs

$mergeObjects (função de janela)

$mergeObjects

Novidades na versão 8.3.

Retorna um documento criado mesclando os documentos de entrada de uma janela.

Observação

Desambiguação

Esta página descreve $mergeObjects quando usado como uma função de janela.

Você também pode usar $mergeObjects nestes outros contextos:

{
$setWindowFields: {
output: {
<outputField>: {
$mergeObjects: <document>,
window: {
<documents|range>: [ "unbounded", <upper> ]
}
}
}
}
}

Observação

A opção sortBy em $setWindowFields é opcional quando o limite superior da janela é "unbounded" ou quando window é omitido. sortBy é necessário quando o limite superior da janela não é "unbounded", como "current".

Quando você omite sortBy, a ordem em que $mergeObjects resolve nomes de campo conflitantes não é garantida.

Campo
Tipo
necessidade
Descrição

<document>

Expressão

Obrigatório

Um nome de campo ou expressão que avalia para um documento. $percentile mescla os valores do documento de todos os documentos na janela.

window

Documento

Opcional

Especifica a janela de documentos na qual o $percentile opera. O limite inferior deve ser "unbounded". Se omitida, a janela inclui todos os documentos na partição.

$mergeObjects suporta apenas janelas não removíveis, o que significa que o limite inferior é "unbounded". Se você especificar uma janela em que o limite inferior não é "unbounded", a operação retornará um erro.

$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.

Crie uma coleção productUpdates:

db.productUpdates.insertMany( [
{ _id: 1, product: "gadget", date: ISODate("2024-01-01"), specs: { color: "blue" } },
{ _id: 2, product: "gadget", date: ISODate("2024-01-02"), specs: { size: "medium" } },
{ _id: 3, product: "gadget", date: ISODate("2024-01-03"), specs: { weight: 0.5 } },
{ _id: 4, product: "widget", date: ISODate("2024-01-01"), specs: { color: "red" } },
{ _id: 5, product: "widget", date: ISODate("2024-01-02"), specs: { material: "plastic" } }
] )

Cada documento representa uma atualização de produto que adiciona novos campos de especificação. Como cada atualização contribui com nomes de campo diferentes para o subdocumento specs, $mergeObjects pode acumular um perfil de especificação completo à medida que a janela se expande.

O pipeline a seguir usa $mergeObjects em $setWindowFields para retornar uma lista de especificações de produtos que é atualizada cumulativamente à medida que novas especificações são adicionadas à janela. Para cada documento, cumulativeSpecs contém as especificações mescladas de todas as atualizações até o documento atual, inclusive:

db.productUpdates.aggregate( [
{
$setWindowFields: {
partitionBy: "$product",
sortBy: { date: 1 },
output: {
cumulativeSpecs: {
$mergeObjects: "$specs",
window: {
documents: [ "unbounded", "current" ]
}
}
}
}
},
{ $sort: { product: 1, date: 1 } },
{ $project: { _id: 0, product: 1, date: 1, specs: 1, cumulativeSpecs: 1 } }
] )

No pipeline anterior:

  • $setWindowFields divide documentos por product e classifica por date em ordem crescente.

  • $mergeObjects usa uma janela unbounded a current para mesclar todos os documentos specs desde o início de cada partição até o documento atual, produzindo uma especificação acumulada em execução.

  • $sort classifica os resultados finais por product e date em ordem crescente.