DataWorks ofrece sincronización bidireccional de datos con MongoDB. En este tema se describen las funciones de sincronización de datos que DataWorks proporciona para MongoDB.
Versiones compatibles
Solo se admiten las versiones 4.x, 5.x, 6.x, 7.x y 8.0 de MongoDB.
Notas de uso
Conéctese a una base de datos de MongoDB mediante una cuenta creada específicamente para esa base de datos. Si utiliza un origen de datos de ApsaraDB for MongoDB, se crea una cuenta root de forma predeterminada. Por motivos de seguridad, se recomienda no usar la cuenta root al agregar un origen de datos de MongoDB.
Si utiliza un clúster fragmentado de MongoDB, debe configurar la dirección de un nodo mongos para el origen de datos. No configure la dirección de un nodo mongod/shard. De lo contrario, la tarea de sincronización podría consultar datos únicamente del shard especificado en lugar de todo el conjunto de datos. Para obtener más información sobre mongos y mongod, consulte la documentación de mongos y mongod.
-
Si la concurrencia es mayor que 1, todos los campos
_idde la colección configurada para la tarea de sincronización deben tener el mismo tipo de datos. Por ejemplo, todos los campos_iddeben ser de tipo string u ObjectId. De lo contrario, es posible que algunos datos no se sincronicen.NotaCuando la concurrencia es mayor que 1, la tarea se divide con base en el campo
_id. Por lo tanto, en este escenario no se admiten tipos de datos mixtos para el campo_id. Si el campo_idcontiene varios tipos de datos, establezca la concurrencia en 1 para la sincronización. Para ello, no configure el parámetro splitFactor o establezca el parámetro splitFactor en 1.
Data Integration no admite el tipo array. Sin embargo, MongoDB sí lo admite y ofrece una función de indexación muy potente. Puede configurar ciertos parámetros para convertir cadenas en arreglos de MongoDB. Después de la conversión, podrá escribir los datos en MongoDB de forma paralela.
Las bases de datos de MongoDB autogestionadas no admiten el acceso por red pública. Solo se puede acceder a ellas a través de la red interna de Alibaba Cloud.
No se admiten los clústeres de MongoDB desplegados con docker.
No es posible utilizar el parámetro query para leer datos de columnas específicas.
En una tarea de sincronización por lotes, si Data Integration no logra recuperar la estructura de campos desde MongoDB, genera asignaciones de campos para seis campos de forma predeterminada. Los nombres de estos campos son
col1,col2,col3,col4,col5ycol6.-
Durante la ejecución de la tarea, se usa de forma predeterminada el comando
splitVectorpara fragmentarla. Algunas versiones de MongoDB no admiten el comandosplitVector, lo cual puede provocar el errorno such cmd splitVector. Para evitarlo, haga clic en el icono
en la configuración de la tarea, cambie al editor de código y agregue el siguiente parámetro a la configuración de parámetros de MongoDB para impedir el uso de splitVector."useSplitVector" : false
Tipos de campo compatibles
Tipos de datos de MongoDB que admite MongoDB Reader
Data Integration admite la mayoría de los tipos de datos de MongoDB, aunque no todos. Compruebe que sus tipos de datos sean compatibles.
Cuando Data Integration lee los tipos de datos admitidos, ejecuta las siguientes operaciones:
-
Para los tipos de datos primitivos, Data Integration lee automáticamente los datos de la ruta correspondiente según el nombre del campo configurado en el parámetro column. Para obtener más información, consulte Appendix: Sample script and parameter description for MongoDB. También convierte el tipo de datos de manera automática, por lo que no es necesario especificar la propiedad type de la columna.
Tipo
Lectura por lotes (MongoDB Reader)
Descripción
ObjectId
Compatible
Tipo de identificador de objeto.
Double
Compatible
Tipo de número de punto flotante de 64 bits.
Entero de 32 bits
Compatible
Número entero de 32 bits.
Entero de 64 bits
Compatible
Número entero de 64 bits.
Decimal128
Compatible
Tipo Decimal128.
NotaSi un campo se configura como tipo anidado o de combinación, se procesa como un objeto durante la serialización JSON. Debe agregar el parámetro
decimal128OutputTypey establecerlo enbigDecimalpara generar los datos como valor decimal.String
Compatible
Tipo de cadena de texto.
Boolean
Compatible
Tipo booleano.
Timestamp
Compatible
Tipo de marca de tiempo.
NotaBsonTimestamp almacena marcas de tiempo. No es necesario considerar el impacto de las zonas horarias. Para obtener más información, consulte Problemas de zona horaria en MongoDB.
Date
Compatible
Tipo de fecha.
-
Para algunos tipos de datos complejos, puede configurar la propiedad type de la columna y aplicar un procesamiento personalizado.
Tipo
Lectura por lotes (MongoDB Reader)
Descripción
Document
Compatible
Tipo de documento incrustado.
-
Si no se configura la propiedad type, el documento se convierte directamente mediante serialización JSON.
-
Si la propiedad type se establece en
document, el campo es de tipo anidado. MongoDB Reader lee las propiedades del documento según la ruta. Para ver un ejemplo detallado, consulte Example 2: Recursively parsing a multi-level nested Document más adelante.
Array
Compatible
Tipo de arreglo.
-
Si type se establece en
array.jsonoarrays, los datos se procesan directamente mediante serialización JSON. -
Si type se establece en
arrayodocument.array, los elementos se concatenan en una cadena. El separador, definido en la propiedad splitter de la columna, es una coma (,) de forma predeterminada.
ImportanteData Integration no admite el tipo array. Sin embargo, MongoDB sí lo admite y ofrece una función de indexación muy potente. Puede configurar ciertos parámetros para convertir cadenas en arreglos de MongoDB. Después de la conversión, podrá escribir los datos en MongoDB de forma paralela.
-
Tipo de datos especial de Data Integration: combine
|
Tipo |
Lectura por lotes (MongoDB Reader) |
Descripción |
|
Combine |
Compatible |
Tipo de datos personalizado de Data Integration. Si type se establece en |
Asignaciones de tipos de datos de MongoDB Reader
A continuación se muestra una tabla que lista las asignaciones entre los tipos de datos de MongoDB y los de Data Integration para MongoDB Reader.
|
Categoría de tipo convertido |
Tipo de datos de MongoDB |
|
LONG |
INT, LONG, document.INT y document.LONG |
|
DOUBLE |
DOUBLE y document.DOUBLE |
|
STRING |
STRING, ARRAY, document.STRING, document.ARRAY y COMBINE |
|
DATE |
DATE y document.DATE |
|
BOOLEAN |
BOOL y document.BOOL |
|
BYTES |
BYTES y document.BYTES |
Asignaciones de tipos de datos de MongoDB Writer
|
Categoría de tipo |
Tipo de datos de MongoDB |
|
Entero |
INT y LONG |
|
Punto flotante |
DOUBLE |
|
Cadena |
STRING y ARRAY |
|
Fecha y hora |
DATE |
|
Booleano |
BOOL |
|
Binario |
BYTES |
Ejemplo 1: Uso del tipo combine
El tipo de datos combine del plugin MongoDB Reader permite combinar varios campos de un documento de MongoDB en una sola cadena JSON. Por ejemplo, suponga que desea importar campos de tres documentos de MongoDB a MaxCompute. En el siguiente ejemplo, los campos se representan mediante claves en lugar de pares clave-valor. Los campos a y b son comunes a los tres documentos, mientras que x_n es un campo variable.
doc1: a b x_1 x_2doc2: a b x_2 x_3 x_4doc3: a b x_5
En el archivo de configuración, debe especificar explícitamente los campos que requieren una asignación uno a uno. Para los campos que desea combinar, asigne un nombre nuevo distinto de cualquier nombre de campo existente en el documento y establezca el tipo en COMBINE. El siguiente código muestra un ejemplo.
"column": [
{
"name": "a",
"type": "string",
},
{
"name": "b",
"type": "string",
},
{
"name": "doc",
"type": "combine",
}
]
La siguiente tabla muestra la salida final en MaxCompute.
|
odps_column1 |
odps_column2 |
odps_column3 |
|
a |
b |
{x_1,x_2} |
|
a |
b |
{x_2,x_3,x_4} |
|
a |
b |
{x_5} |
Después de usar el tipo combine para fusionar varios campos de un documento de MongoDB, los campos comunes se eliminan automáticamente cuando la salida se asigna a MaxCompute. Solo se conservan los campos únicos del documento.
Por ejemplo, a y b son campos comunes en todos los documentos. Tras combinar los campos del documento doc1: a b x_1 x_2 con el tipo combine, la salida es {a,b,x_1,x_2}. Cuando este resultado se asigna a MaxCompute, los campos comunes a y b se eliminan. La salida final es {x_1,x_2}.
Ejemplo 2: Análisis sintáctico recursivo de un documento anidado de varios niveles
Si un documento de MongoDB tiene varios niveles de anidamiento, puede configurar el tipo document para analizarlo sintácticamente de forma recursiva. El siguiente código muestra un ejemplo.
-
Datos de origen en MongoDB:
{ "name": "name1", "a": { "b": { "c": "this is value" } } } -
Configuración de columnas de MongoDB:
{"name":"_id","type":"string"} {"name":"name","type":"string"} {"name":"a.b.c","type":"document"}Una vez completada la configuración, los campos de origen y destino se asignan de la siguiente manera:
_idse asigna aid,namese asigna anameya.b.cse asigna ac.
Con la configuración anterior, el valor del campo de origen anidado a.b.c se escribe en el campo de destino c. Una vez que se ejecuta la tarea de sincronización, los datos escritos en el destino son this is value.
Agregar un origen de datos
Antes de desarrollar una tarea de sincronización en DataWorks, debe agregar el origen de datos requerido siguiendo las instrucciones de Data source configuration. Puede consultar las descripciones de parámetros en la consola de DataWorks para comprender el significado de cada parámetro al agregar un origen de datos.
Desarrollar una tarea de sincronización de datos
Para conocer el punto de entrada y el procedimiento de configuración de una tarea de sincronización, consulte las siguientes guías de configuración.
Configurar una tarea de sincronización por lotes para una sola tabla
Para obtener más información sobre el procedimiento, consulte Configure a task in the codeless UI y Configure a task in the code editor.
Para conocer todos los parámetros y ver un script de ejemplo para el editor de código, consulte Appendix: Sample script and parameter description for MongoDB.
Configurar una tarea de sincronización en tiempo real para una sola tabla
Consulte Configure a real-time synchronization task for a single table.
Configurar una tarea de sincronización para una base de datos completa
Es posible configurar tareas de sincronización por lotes, sincronización en tiempo real completa e incremental, o sincronización en tiempo real desde bases de datos fragmentadas para una base de datos completa. Para obtener más información, consulte Batch synchronization task for an entire database y Configure a real-time synchronization task for an entire database.
Mejores prácticas
Preguntas frecuentes
Apéndice: Script de ejemplo y descripción de parámetros para MongoDB
Configurar una tarea de sincronización por lotes mediante el editor de código
Si desea configurar una tarea de sincronización por lotes mediante el editor de código, debe definir los parámetros correspondientes en el script según los requisitos unificados de formato. Para obtener más información, consulte Script mode configuration. A continuación se describen los parámetros que debe configurar para los orígenes de datos cuando utilice el editor de código.
Script de ejemplo de Reader
El siguiente script es un ejemplo de un trabajo configurado para extraer datos de MongoDB hacia un entorno local. Para obtener más información sobre los parámetros, consulte las descripciones posteriores.
Elimine los comentarios antes de ejecutar el código.
No es posible extraer elementos específicos de un array.
{
"type":"job",
"version":"2.0",// Version number.
"steps":[
{
"category": "reader",
"name": "Reader",
"parameter": {
"datasource": "datasourceName", // Data source name.
"collectionName": "tag_data", // Collection name.
"query": "", // Data filtering query.
"column": [
{
"name": "unique_id", // Field name.
"type": "string" // Field type.
},
{
"name": "sid",
"type": "string"
},
{
"name": "user_id",
"type": "string"
},
{
"name": "auction_id",
"type": "string"
},
{
"name": "content_type",
"type": "string"
},
{
"name": "pool_type",
"type": "string"
},
{
"name": "frontcat_id",
"type": "array",
"splitter": ""
},
{
"name": "categoryid",
"type": "array",
"splitter": ""
},
{
"name": "gmt_create",
"type": "string"
},
{
"name": "taglist",
"type": "array",
"splitter": " "
},
{
"name": "property",
"type": "string"
},
{
"name": "scorea",
"type": "int"
},
{
"name": "scoreb",
"type": "int"
},
{
"name": "scorec",
"type": "int"
},
{
"name": "a.b",
"type": "document.int"
},
{
"name": "a.b.c",
"type": "document.array",
"splitter": " "
}
]
},
"stepType": "mongodb"
},
{
"stepType":"stream",
"parameter":{},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"common": {
"column": {
"timeZone": "GMT+0" // Time zone.
}
},
"errorLimit":{
"record":"0"// Number of error records.
},
"speed":{
"throttle":true,// Specifies whether to enable throttling. If you set this parameter to false, throttling is disabled and the mbps parameter does not take effect. If you set this parameter to true, throttling is enabled.
"concurrent":1, // Number of concurrent jobs.
"mbps":"12"// Throttling rate. 1 mbps = 1 MB/s.
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}
|
Parámetro |
Descripción |
|
datasource |
Nombre del origen de datos. En el editor de código, el valor de este parámetro debe coincidir con el nombre del origen de datos agregado. |
|
collectionName |
Nombre de la colección de MongoDB. |
|
hint |
El parámetro hint obliga al optimizador de consultas a usar un índice específico, lo cual puede mejorar el rendimiento. Para obtener más información, consulte parámetro hint. Ejemplo:
|
|
column |
Arreglo que especifica los campos del documento que se leerán desde MongoDB.
|
|
batchSize |
Número de registros que se recuperan en cada lote. Este parámetro es opcional. Valor predeterminado: |
|
cursorTimeoutInMs |
Tiempo de espera del cursor. Este parámetro es opcional. Valor predeterminado: Nota
|
|
query |
Utilice este parámetro para filtrar los datos devueltos por MongoDB. Solo se admiten los formatos de hora especificados; el formato de marca de tiempo UNIX no se admite de forma directa. Nota
A continuación se muestran ejemplos comunes del parámetro query:
Nota
Para obtener más información sobre la sintaxis de consulta de MongoDB, consulte la documentación oficial de MongoDB. |
|
splitFactor |
Si existe una desviación de datos significativa, considere aumentar splitFactor para lograr una fragmentación más detallada sin incrementar la concurrencia. |
Script de ejemplo de Writer
El siguiente script es un ejemplo de un trabajo de sincronización de datos configurado para escribir datos en MongoDB. Para obtener más información sobre los parámetros, consulte las descripciones posteriores.
{
"type": "job",
"version": "2.0",// Version number.
"steps": [
{
"stepType": "stream",
"parameter": {},
"name": "Reader",
"category": "reader"
},
{
"stepType": "mongodb",// Plugin name.
"parameter": {
"datasource": "",// Data source name.
"column": [
{
"name": "_id",// Column name.
"type": "ObjectId"// Data type. If replaceKey is _id, you must set type to ObjectId. If you set type to string, the replacement fails.
},
{
"name": "age",
"type": "int"
},
{
"name": "id",
"type": "long"
},
{
"name": "wealth",
"type": "double"
},
{
"name": "hobby",
"type": "array",
"splitter": " "
},
{
"name": "valid",
"type": "boolean"
},
{
"name": "date_of_join",
"format": "yyyy-MM-dd HH:mm:ss",
"type": "date"
}
],
"writeMode": {// Write mode.
"isReplace": "true",
"replaceKey": "_id"
},
"collectionName": "datax_test"// Collection name.
},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {// Number of error records.
"record": "0"
},
"speed": {
"throttle": true,// Specifies whether to enable throttling. If you set this parameter to false, throttling is disabled and the mbps parameter does not take effect. If you set this parameter to true, throttling is enabled.
"concurrent": 1,// Number of concurrent jobs.
"mbps": "1"// Throttling rate. 1 mbps = 1 MB/s.
},
"jvmOption": "-Xms1024m -Xmx1024m"
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
Parámetros del script de Writer
|
Parámetro |
Descripción |
Obligatorio |
Valor predeterminado |
|
datasource |
Nombre del origen de datos. En el editor de código, el valor de este parámetro debe coincidir con el nombre del origen de datos agregado. |
Sí |
Ninguna |
|
collectionName |
Nombre de la colección de MongoDB. |
Sí |
Ninguna |
|
column |
Arreglo que especifica los campos del documento que se escribirán en MongoDB.
|
Sí |
Ninguna |
|
writeMode |
Indica si se sobrescriben los datos durante la transmisión. Incluye isReplace y replaceKey:
Nota
Si isReplace se establece en true y se configura un campo distinto de
Esto ocurre porque los datos por escribir contienen registros cuyo |
No |
Ninguna |
|
preSql |
Operación previa que se ejecuta antes de escribir los datos en MongoDB, como limpiar datos históricos. Si preSql está vacío, no se configura ninguna operación previa. Cuando configure preSql, compruebe que su valor cumpla con la sintaxis JSON. |
No |
Ninguna |
Al ejecutar un trabajo de Data Integration, primero se ejecuta preSql configurado. La fase de escritura de datos comienza únicamente después de que finaliza la ejecución de preSql. El parámetro preSql no afecta el contenido de los datos escritos, mientras que preSql garantiza que la ejecución de Data Integration sea idempotente. Por ejemplo, puede usar preSql para limpiar los datos históricos antes de cada ejecución de la tarea, según sus reglas de negocio. De este modo, si una tarea falla, basta con volver a ejecutar el trabajo de Data Integration.
A continuación se describen los requisitos de formato para preSql:
-
Configure el campo type para especificar el tipo de operación previa. Los valores compatibles son drop y remove. Ejemplo:
"preSql":{"type":"remove"}.drop: elimina la colección y los datos que contiene. La colección por eliminar se especifica mediante el parámetro collectionName.
remove: elimina los datos según una condición.
-
json: utilice un objeto JSON para especificar las condiciones de eliminación de datos. Ejemplo:
"preSql":{"type":"remove", "json":"{'operationTime':{'$gte':ISODate('${last_day}T00:00:00.424+0800')}}"}. En este ejemplo,${last_day}es un parámetro de programación de DataWorks con el formato$[yyyy-mm-dd]. También puede usar otros operadores condicionales compatibles con MongoDB (como $gt, $lt, $gte y $lte), operadores lógicos (como and y or) o funciones (como max, min, sum, avg e ISODate) según lo requiera.Data Integration ejecuta la eliminación de datos mediante la siguiente API estándar de MongoDB:
query=(BasicDBObject) com.mongodb.util.JSON.parse(json); col.deleteMany(query);NotaSe recomienda utilizar la configuración JSON para eliminar datos según condiciones.
-
item: dentro de un elemento item, configure el nombre de la columna (name), la condición (condition) y el valor de la columna (value) para filtrar los datos. Ejemplo:
"preSql":{"type":"remove","item":[{"name":"pv","value":"100","condition":"$gt"},{"name":"pid","value":"10"}]}.Data Integration construye una condición de consulta a partir de los elementos item configurados y luego ejecuta la eliminación mediante una API estándar de MongoDB. Por ejemplo:
col.deleteMany(query);.
Si no se reconoce preSql, no se ejecuta ninguna operación de eliminación previa.