$merge guarda los resultados de un pipeline de agregación en una colección temporal en el clúster de Atlas. Atlas Data Federation luego ejecuta $merge localmente en el clúster de Atlas para fusionar datos en fragmentos en la colección de destino. En caso de fallo durante una operación $merge, esto garantiza que al menos se escriban datos parciales en la colección de destino.
En Atlas Data Federation, $merge puede:
Guarde datos desde cualquiera de los almacenes de instancia federada de base de datos compatibles.
Guardar en el mismo o en otro clúster de Atlas, base de datos o colección dentro del mismo Proyecto de Atlas.
Para permitir guardar en un clúster de Atlas, Atlas Data Federation introduce sintaxis alternativa para el campo into obligatorio. Atlas Data Federation admite todos los demás campos como se describe para $merge.
Para aprender más, consulte $merge etapa pipeline.
Permisos requeridos
Para usar $merge para guardar en una colección del clúster de Atlas, debes ser un usuario de base de datos con los siguientes privilegios:
findy
Considerations
Si la agregación falla, Atlas Data Federation no revierte ninguna de las operaciones de guardar que completó la $merge antes de que se produjera el error.
Sintaxis
{ "$merge": { "into": { "atlas": { "projectId": "<atlas-project-ID>", "clusterName": "<atlas-cluster-name>", "db": "<atlas-database-name>", "coll": "<atlas-collection-name>" } }, "on": "<identifier field>"|[ "<identifier field1>", ...], "let": { <variables> }, "whenMatched": "replace|keepExisting|merge|fail|pipeline", "whenNotMatched": "insert|discard|fail" } }
Campos
Esta sección describe la sintaxis alternativa que Atlas Data Federation proporciona para el campo into.
Campo | Tipo | Descripción | Necesidad |
|---|---|---|---|
| Objeto | Ubicación para guardar los documentos desde el pipeline de agregación. | Requerido |
| string | Nombre del clúster de Atlas | Requerido |
| string | Nombre de la colección en el clúster Atlas. | Requerido |
| string | Nombre de la base de datos en el clúster Atlas que contiene la colección. | Requerido |
| string | Identificador único del proyecto que contiene el clúster de Atlas. Este es el ID del Proyecto que contiene su instancia federada de base de datos. Si se omite, se usa como valor por defecto el ID del Proyecto que contiene la instancia federada de base de datos. | Opcional |
Para obtener más información sobre los otros campos, on, let, whenMatched y whenNotMatched, consulte la documentación del servidor de MongoDB para $merge.
Nota
Para utilizar on en varios campos, debes crear un índice único compuesto en los campos identificadores ``on``.
opciones
Opción | Tipo | Descripción | Necesidad | |
|---|---|---|---|---|
| booleano | Bandera para ejecutar operaciones de agregación en segundo plano. Si se omite, el valor por defecto es Utiliza esta opción si deseas enviar otras consultas nuevas sin esperar a que se completen las consultas en curso o desconectar la conexión de tu instancia federada de base de datos mientras las consultas continúan ejecutándose en segundo plano. | Opcional |
Resolución de IDs de documentos duplicados
Al escribir documentos desde tu fichero o tus almacenes de datos en tu clúster de Atlas, tus documentos podrían tener campos duplicados _id. Esta sección describe cómo Atlas Data Federation resuelve los duplicados e incluye recomendaciones para resolver los duplicados en tu pipeline de agregación.
Resolviendo IDS Duplicados en Atlas Data Federation
Para resolver los duplicados, Atlas Data Federation:
Escribe documentos en una colección de Atlas
Xen el orden en que recibe los documentos hasta que encuentra un duplicado.Escribe el documento con el campo
_idduplicado y todos los documentos posteriores en una nueva colección de AtlasY.Ejecuta la etapa especificada
$mergepara fusionar la colecciónYen la colecciónX.Guarda los documentos resultantes en la colección de destino en el clúster de Atlas especificado.
Nota
Atlas Data Federation solo resuelve los valores duplicados en el campo _id. No resuelve valores duplicados en otros campos con índices únicos.
Remediación de IDs duplicados
Para remediar los campos duplicados de _id, se puede:
Incluya una etapa de
$sorten su pipeline para especificar el orden en que Atlas Data Federation debe procesar los documentos resultantes.En función del orden de los documentos que fluyen hacia la etapa
$merge, elija cuidadosamente el valor de las opcioneswhenMatchedywhenNotMatchedde la etapa$merge.Ejemplo
Los siguientes ejemplos muestran cómo Atlas Data Federation resuelve duplicados durante la etapa
$mergecuandowhenMatchedla opción está configurada enkeepExistingoreplace. Estos ejemplos utilizan los siguientes documentos:{ "_id" : 1, "state" : "FL" }, { "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } Supón que ejecutas el siguiente pipeline en los documentos listados arriba:
db.s3coll.aggregate([ { "$sort": { "_id": 1, "state": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "clustername", "db": "clusterdb", "coll": "clustercoll" } }, "on": "_id", "whenMatched": "keepExisting", "whenNotMatched": "insert" } } ]) Atlas Data Federation escribe los siguientes datos en dos colecciones llamadas
XyY:// Collection X { "_id" : 1, "state" : "FL" } // Collection Y { "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } Atlas Data Federation luego fusiona documentos de la colección
Yen la colecciónX. Para la opción dewhenMatched: keepExistingen el pipeline, Atlas Data Federation mantiene el documento existente con_id: 1en la colecciónX. Por lo tanto, el resultado de la pipeline con duplicados contiene los siguientes documentos:{ "_id" : 1, "state" : "FL" }, { "_id" : 2, "state" : "TX" } Atlas Data Federation fusiona estos documentos en la colección de destino en el clúster Atlas especificado.
Supón que ejecutas el siguiente pipeline en los documentos listados arriba:
db.s3coll.aggregate([ { "$sort": { "_id": 1, "state": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "clustername", "db": "clusterdb", "coll": "clustercoll" } }, "on": "_id", "whenMatched": "replace", "whenNotMatched": "insert" } } ]) Atlas Data Federation escribe los siguientes datos en dos colecciones llamadas
XyY:// Collection X { "_id" : 1, "state" : "FL" } // Collection Y { "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } Atlas Data Federation fusiona documentos de la colección
Yen la colecciónX. Para la opciónwhenMatched: replaceen la pipeline, Atlas Data Federation reemplaza el documento con_id: 1en la colecciónXcon el documento con_id: 1en la colecciónY. Por lo tanto, el resultado de la pipeline con duplicados contiene los siguientes documentos:{ "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } Atlas Data Federation fusiona estos documentos en la colección de destino en el clúster Atlas especificado.
Evitar usar la opción
whenNotMatched: discard.Ejemplo
Este ejemplo muestra cómo Atlas Data Federation resuelve duplicados cuando la opción
whenNotMatchedestá configurada endiscardusando los siguientes documentos:{ "_id" : 1, "state" : "AZ" }, { "_id" : 1, "state" : "CA" }, { "_id" : 2, "state" : "NJ" }, { "_id" : 3, "state" : "NY" }, { "_id" : 4, "state" : "TX" } Supón que ejecutas el siguiente pipeline en los documentos listados arriba:
db.archivecoll.aggregate([ { "$sort": { "_id": 1, "state": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "clustername", "db": "clusterdb", "coll": "clustercoll" } }, "on": "_id", "whenMatched": "replace", "whenNotMatched": "discard" } } ]) Atlas Data Federation escribe los siguientes datos en dos colecciones llamadas
XyY:// Collection X { "_id" : 1, "state" : "AZ" // gets replaced } // Collection Y { "_id" : 1, "state" : "CA" } { "_id" : 2, "state" : "NJ" // gets discarded } { "_id" : 3, "state" : "NY" // gets discarded } { "_id" : 4, "state" : "TX" // gets discarded } Atlas Data Federation fusiona documentos de la colección
Yen la colecciónX. Para la opciónwhenMatched: replaceen el pipeline, Atlas Data Federation reemplaza el documento con_id: 1en la colecciónXcon el documento con_id: 1en la colecciónY. Para la opciónwhenNotMatched: discarden el pipeline, Atlas Data Federation descarta documentos en la colecciónYque no coincidan con un documento en la colecciónX. Por lo tanto, el resultado de la pipeline con duplicados contiene únicamente el siguiente documento:{ "_id" : 1, "state" : "CA" } Atlas Data Federation luego fusiona este documento en la colección objetivo en el clúster Atlas especificado.
Ejemplo
Combinar datos usando $merge
La siguiente sintaxis de ejemplo $merge escribe los resultados en una colección sampleDB.mySampleData en el clúster de Atlas denominado myTestCluster. El ejemplo no especifica un ID del proyecto; la $merge etapa utiliza el ID del Proyecto que contiene su instancia federada de base de datos.
Ejemplo
1 db.mySampleData.aggregate( 2 [ 3 { 4 "$merge": { 5 "into": { 6 "atlas": { 7 "clusterName": "myTestCluster", 8 "db": "sampleDB", 9 "coll": "mySampleData" 10 } 11 }, 12 ... 13 } 14 } 15 ] 16 )
Ejecute $merge en segundo plano
El siguiente ejemplo $merge sintaxis guarda los resultados en una colección sampleDB.mySampleData en el clúster de Atlas denominado myTestCluster en segundo plano. El ejemplo no especifica un ID del proyecto; la $merge etapa utiliza el ID del Proyecto que contiene su instancia federada de base de datos.
Ejemplo
1 db.runCommand({ 2 "aggregate": "mySampleData", 3 "pipeline": [ 4 { 5 "$merge": { 6 "into": { 7 "atlas": { 8 "clusterName": "myTestCluster", 9 "db": "sampleDB", 10 "coll": "mySampleData" 11 } 12 }, 13 ... 14 } 15 } 16 ], 17 { "background" : true } 18 })