Definición
Devuelve un documento creado mediante la fusión de los documentos de entrada de una ventana.
Nota
Desambiguación
Esta página describe $mergeObjects cuando se utiliza como función de ventana.
También puedes usar $mergeObjects en estos otros contextos:
$mergeObjects (accumulator), que devuelve un documento combinado a partir de un grupo de documentos de entrada.$mergeObjects (expression), que fusiona una serie de documentos en un único documento.
Sintaxis
{ $setWindowFields: { output: { <outputField>: { $mergeObjects: <document>, window: { <documents|range>: [ "unbounded", <upper> ] } } } } }
Nota
La opción sortBy en $setWindowFields es opcional cuando el límite superior de la ventana es "unbounded" o cuando se omite window. sortBy es obligatorio cuando el límite superior de la ventana no es "unbounded", como por ejemplo "current".
Cuando se omite sortBy, no se garantiza el orden en que $mergeObjects resuelve los nombres de campo conflictivos.
Campos de comandos
Campo | Tipo | Necesidad | Descripción |
|---|---|---|---|
| expresión | Requerido | Un nombre de campo o expresión que se evalúa como un documento. |
| Documento | Opcional | Especifica el rango de documentos sobre el que opera |
Comportamiento
Ventanas no extraíbles
$mergeObjects Solo admite ventanas no extraíbles, lo que significa que el límite inferior es "unbounded". Si especifica una ventana cuyo límite inferior no sea "unbounded", la operación devuelve un error.
Manejo de entradas nulas
$mergeObjects Ignora los valores de entrada null. Si todos los valores de entrada son null, $mergeObjects devuelve un documento vacío { }.
Comportamiento de sobrescritura de campo
$mergeObjects Sobrescribe los valores de los campos al fusionar los documentos. Si varios documentos de entrada contienen el mismo nombre de campo, la salida contendrá el valor del último documento de entrada que contenga el campo conflictivo.
Ejemplo
Cree una colección 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 una actualización del producto que añade nuevos campos de especificación. Dado que cada actualización aporta nombres de campo diferentes al subdocumento specs, $mergeObjects puede acumular un perfil de especificación completo a medida que se expande la ventana.
La siguiente canalización utiliza $mergeObjects en $setWindowFields para devolver una lista de especificaciones de producto que se actualiza de forma acumulativa a medida que se añaden nuevas especificaciones a la ventana. Para cada documento, cumulativeSpecs contiene las especificaciones combinadas de todas las actualizaciones hasta el documento actual 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 } } ] )
En el pipeline anterior:
$setWindowFieldsparticiona los documentos porproducty los ordena pordateen orden ascendente.$mergeObjectsutiliza una ventana deunboundedacurrentpara fusionar todos los documentosspecsdesde el principio de cada partición hasta el documento actual, produciendo una especificación acumulada continua.$sortordena los resultados finales porproductydateen orden ascendente.