Definição
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:
$mergeObjects (accumulator), que retorna um documento mesclado em um grupo de documentos de entrada.$mergeObjects (expression), que mescla uma array de documentos em um único documento.
Sintaxe
{ $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.
Campos de comando
Campo | Tipo | necessidade | Descrição |
|---|---|---|---|
| Expressão | Obrigatório | Um nome de campo ou expressão que avalia para um documento. |
| Documento | Opcional | Especifica a janela de documentos na qual o |
Comportamento
Janelas não removíveis
$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.
Tratamento de entrada nula
$mergeObjects ignora valores de entrada null. Se todos os valores de entrada forem null, $mergeObjects retornará um documento vazio { }.
Comportamento de Substituição de Campo
$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 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:
$setWindowFieldsdivide documentos porproducte classifica pordateem ordem crescente.$mergeObjectsusa uma janelaunboundedacurrentpara mesclar todos os documentosspecsdesde o início de cada partição até o documento atual, produzindo uma especificação acumulada em execução.$sortclassifica os resultados finais porproductedateem ordem crescente.