O DataWorks oferece sincronização bidirecional de dados com o MongoDB. Este tópico descreve os recursos de sincronização de dados do DataWorks para o MongoDB.
Versões compatíveis
Há suporte apenas para as versões 4.x, 5.x, 6.x, 7.x e 8.0 do MongoDB.
Observações de uso
Conecte-se a um banco de dados MongoDB usando uma conta criada especificamente para ele. Se você utilizar uma source de dados ApsaraDB for MongoDB, uma conta root será criada por padrão. Por motivos de segurança, não use a conta root ao adicionar uma source de dados MongoDB.
Ao utilizar um cluster fragmentado do MongoDB, configure o endereço de um nó mongos para a source de dados. Não configure o endereço de um nó mongod/shard. Caso contrário, a tarefa de sincronização poderá consultar dados apenas do shard especificado, em vez de todo o conjunto de dados. Para obter mais informações sobre mongos e mongod, consulte a documentação do mongos e do mongod.
-
Se a simultaneidade for maior que 1, todos os campos
_idna coleção configurada para a tarefa de sincronização devem ter o mesmo tipo de dados. Por exemplo, todos os campos_iddevem ser do tipo string ou ObjectId. Do contrário, alguns dados podem não ser sincronizados.NotaQuando a simultaneidade é maior que 1, a tarefa é dividida com base no campo
_id. Portanto, tipos de dados mistos não são suportados para o campo_idnesse cenário. Se o campo_idcontiver vários tipos de dados, defina a simultaneidade como 1 para a sincronização. Para isso, não configure o parâmetro splitFactor ou defina-o como 1.
O Data Integration não suporta o tipo array. No entanto, o MongoDB suporta esse tipo e oferece um recurso avançado de indexação. Configure parâmetros específicos para converter strings em arrays do MongoDB. Após a conversão, grave os dados no MongoDB em paralelo.
Bancos de dados MongoDB autogerenciados não suportam acesso pela rede pública. O acesso é permitido apenas pela rede interna da Alibaba Cloud.
Não há suporte para clusters MongoDB implantados via Docker.
Não é possível usar o parâmetro query para ler dados de colunas específicas.
Em uma tarefa de sincronização em lote, se o Data Integration não conseguir recuperar a estrutura de campos do MongoDB, ele gerará mapeamentos para seis campos por padrão. Os nomes dos campos são
col1,col2,col3,col4,col5ecol6.-
Durante a execução da tarefa, o comando
splitVectoré usado por padrão para fragmentar a tarefa. Algumas versões do MongoDB não suportam o comandosplitVector, o que pode causar o errono such cmd splitVector. Para evitar esse erro, clique em ícone
na configuração da tarefa, alterne para o editor de código e adicione o seguinte parâmetro à configuração do MongoDB para impedir o uso do splitVector."useSplitVector" : false
Tipos de campo compatíveis
Tipos de dados do MongoDB compatíveis com o MongoDB Reader
O Data Integration suporta a maioria dos tipos de dados do MongoDB, mas não todos. Verifique se seus tipos de dados são compatíveis.
Ao ler tipos de dados suportados, o Data Integration executa as seguintes operações:
-
Para tipos de dados primitivos, o Data Integration lê automaticamente os dados do caminho correspondente com base no nome do campo configurado no parâmetro column. Para obter mais informações, consulte Apêndice: Script de exemplo e descrição de parâmetros para MongoDB. O Data Integration também converte automaticamente o tipo de dados. Não é necessário especifique a propriedade type para a coluna.
Tipo
Leitura em lote (MongoDB Reader)
Descrição
ObjectId
Compatível
Tipo de ID de objeto.
Double
Compatível
Tipo de número de ponto flutuante de 64 bits.
Inteiro de 32 bits
Compatível
Inteiro de 32 bits.
Inteiro de 64 bits
Compatível
Inteiro de 64 bits.
Decimal128
Compatível
Tipo Decimal128.
NotaSe um campo for configurado como tipo aninhado ou combinado, ele será processado como objeto durante a serialização JSON. Adicione o parâmetro
decimal128OutputTypee defina-o comobigDecimalpara gerar os dados como decimal.String
Compatível
Tipo string.
Boolean
Compatível
Tipo booleano.
Timestamp
Compatível
Tipo timestamp.
NotaO BsonTimestamp armazena timestamps. Não é necessário considerar o impacto dos fusos horários. Para obter mais informações, consulte Problemas de fuso horário no MongoDB.
Date
Compatível
Tipo data.
-
Para alguns tipos de dados complexos, configure a propriedade type da coluna para realizar processamento personalizado.
Tipo
Leitura em lote (MongoDB Reader)
Descrição
Document
Compatível
Tipo de documento incorporado.
-
Se a propriedade type não estiver configurada, o Document será convertido diretamente por serialização JSON.
-
Se a propriedade type estiver definida como
document, o campo será um tipo aninhado. O MongoDB Reader lê as propriedades do Document com base no caminho. Para visualize um exemplo detalhado, consulte Exemplo 2: Análise recursiva de Document aninhado em vários níveis abaixo.
Array
Compatível
Tipo array.
-
Se type estiver definido como
array.jsonouarrays, os dados serão processados diretamente por serialização JSON. -
Se type estiver definido como
arrayoudocument.array, os elementos serão concatenados em uma string. O separador, especificado na propriedade splitter da coluna, é uma vírgula (,) por padrão.
ImportanteO Data Integration não suporta o tipo array. No entanto, o MongoDB suporta esse tipo e oferece um recurso avançado de indexação. Configure parâmetros específicos para converter strings em arrays do MongoDB. Após a conversão, grave os dados no MongoDB em paralelo.
-
Tipo de dados especial do Data Integration: combine
|
Tipo |
Leitura em lote (MongoDB Reader) |
Descrição |
|
Combine |
Compatível |
Tipo de dados personalizado no Data Integration. Se type estiver definido como |
Mapeamentos de tipos de dados do MongoDB Reader
A tabela a seguir lista os mapeamentos entre os tipos de dados do MongoDB e os tipos de dados do Data Integration para o MongoDB Reader.
|
Categoria de tipo convertido |
Tipo de dados do MongoDB |
|
LONG |
INT, LONG, document.INT e document.LONG |
|
DOUBLE |
DOUBLE e document.DOUBLE |
|
STRING |
STRING, ARRAY, document.STRING, document.ARRAY e COMBINE |
|
DATE |
DATE e document.DATE |
|
BOOLEAN |
BOOL e document.BOOL |
|
BYTES |
BYTES e document.BYTES |
Mapeamentos de tipos de dados do MongoDB Writer
|
Categoria de tipo |
Tipo de dados do MongoDB |
|
Inteiro |
INT e LONG |
|
Ponto flutuante |
DOUBLE |
|
String |
STRING e ARRAY |
|
Data e hora |
DATE |
|
Booleano |
BOOL |
|
Binário |
BYTES |
Exemplo 1: Uso do tipo combine
O tipo de dados combine do plugin MongoDB Reader permite mesclar vários campos de um documento do MongoDB em uma única string JSON. Por exemplo, suponha que você queira importar campos de três documentos do MongoDB para o MaxCompute. No exemplo a seguir, os campos são representados por chaves em vez de pares chave-valor. Os campos a e b são comuns a todos os três documentos, e x_n é um campo variável.
doc1: a b x_1 x_2doc2: a b x_2 x_3 x_4doc3: a b x_5
No arquivo de configuração, especifique explicitamente os campos que exigem mapeamento um para um. Para os campos que deseja mesclar, atribua um novo nome diferente de qualquer nome de campo existente no documento e defina o tipo como COMBINE. O código a seguir fornece um exemplo.
"column": [
{
"name": "a",
"type": "string",
},
{
"name": "b",
"type": "string",
},
{
"name": "doc",
"type": "combine",
}
]
A tabela a seguir mostra a saída final no 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} |
Após usar o tipo combine para mesclar vários campos em um documento do MongoDB, os campos comuns são excluídos automaticamente quando a saída é mapeada para o MaxCompute. Apenas os campos exclusivos do documento são mantidos.
Por exemplo, a e b são campos comuns em todos os documentos. Depois que os campos no documento doc1: a b x_1 x_2 são mesclados usando o tipo combine, a saída é {a,b,x_1,x_2}. Quando esse resultado é mapeado para o MaxCompute, os campos comuns a e b são excluídos. A saída final é {x_1,x_2}.
Exemplo 2: Análise recursiva de Document aninhado em vários níveis
Se um documento no MongoDB tiver vários níveis de aninhamento, configure o tipo document para analisá-lo recursivamente. O código a seguir fornece um exemplo.
-
Dados de origem no MongoDB:
{ "name": "name1", "a": { "b": { "c": "this is value" } } } -
Configuração de coluna do MongoDB:
{"name":"_id","type":"string"} {"name":"name","type":"string"} {"name":"a.b.c","type":"document"}Após concluir a configuração, os campos de origem e destino são mapeados da seguinte forma:
_idé mapeado paraid,nameé mapeado paranameea.b.cé mapeado parac.
Com a configuração anterior, o valor do campo de origem aninhado a.b.c é gravado no campo de destino c. Após a execução da tarefa de sincronização, os dados gravados no destino serão this is value.
Adicionar uma source de dados
Antes de desenvolver uma tarefa de sincronização no DataWorks, adicione a source de dados necessária seguindo as instruções em Gerenciamento de fontes de dados. Consulte as descrições de parâmetros no console do DataWorks para entender o significado dos parâmetros ao adicionar uma source de dados.
Desenvolver uma tarefa de sincronização de dados
Para obter informações sobre o ponto de entrada e o procedimento de configuração de uma tarefa de sincronização, consulte os guias a seguir.
Configurar uma tarefa de sincronização em lote para uma única tabela
Para obter mais informações sobre o procedimento, consulte Configurar uma tarefa na interface sem código e Configurar uma tarefa no editor de código.
Para obter mais informações sobre todos os parâmetros e um script de exemplo para o editor de código, consulte Apêndice: Script de exemplo e descrição de parâmetros para MongoDB.
Configurar uma tarefa de sincronização em tempo real para uma única tabela
Consulte Configurar uma tarefa de sincronização em tempo real para uma única tabela.
Configurar uma tarefa de sincronização para um banco de dados inteiro
É possível configurar tarefas para sincronização em lote, sincronização em tempo real completa e incremental ou sincronização em tempo real de bancos de dados fragmentados para um banco de dados inteiro. Para obter mais informações, consulte Tarefa de sincronização em lote para um banco de dados inteiro e Configurar uma tarefa de sincronização em tempo real para um banco de dados inteiro.
Práticas recomendadas
Perguntas frequentes
Apêndice: Script de exemplo e descrição de parâmetros para MongoDB
Configurar uma tarefa de sincronização em lote usando o editor de código
Para configurar uma tarefa de sincronização em lote usando o editor de código, configure os parâmetros relacionados no script com base nos requisitos unificados de formato de script. Para obter mais informações, consulte Configuração no modo de script. As informações a seguir descrevem os parâmetros que devem ser configurados para fontes de dados ao usar o editor de código para uma tarefa de sincronização em lote.
Exemplo de script do Reader
O script a seguir é um exemplo de job configurado para extrair dados do MongoDB para um ambiente local. Para obter mais informações sobre os parâmetros, consulte as descrições a seguir.
Antes de execute o código, remova os comentários.
Não é possível extrair elementos específicos de um 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 |
Descrição |
|
datasource |
Nome da source de dados. No editor de código, o valor deste parâmetro deve ser igual ao nome da source de dados adicionada. |
|
collectionName |
Nome da coleção do MongoDB. |
|
hint |
O parâmetro hint força o otimizador de consultas a usar um índice específico, o que pode melhorar o desempenho. Para obter mais informações, consulte parâmetro hint. Exemplo:
|
|
column |
Array que especifica os campos do documento a serem lidos do MongoDB.
|
|
batchSize |
Número de registros a serem recuperados em um lote. Parâmetro opcional. Valor padrão: |
|
cursorTimeoutInMs |
Tempo limite do cursor. Parâmetro opcional. Valor padrão: Nota
|
|
query |
Use este parâmetro para filtrar os dados retornados do MongoDB. Apenas os formatos de hora especificados são suportados. O formato de timestamp UNIX não é suportado diretamente. Nota
O código a seguir fornece exemplos comuns para o parâmetro query:
Nota
Para obter mais informações sobre a sintaxe de consulta do MongoDB, consulte a documentação oficial do MongoDB. |
|
splitFactor |
Se existir distorção severa de dados, considere aumentar o splitFactor para obter fragmentação mais refinada sem aumentar a simultaneidade. |
Exemplo de script do Writer
O script a seguir é um exemplo de job de sincronização de dados configurado para gravar dados no MongoDB. Para obter mais informações sobre os parâmetros, consulte as descrições a seguir.
{
"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 do script do Writer
|
Parâmetro |
Descrição |
Obrigatório |
Valor padrão |
|
datasource |
Nome da source de dados. No editor de código, o valor deste parâmetro deve ser igual ao nome da source de dados adicionada. |
Sim |
Nenhum |
|
collectionName |
Nome da coleção do MongoDB. |
Sim |
Nenhum |
|
column |
Array que especifica os campos do documento a serem gravados no MongoDB.
|
Sim |
Nenhum |
|
writeMode |
Especifica se os dados devem ser sobrescritos durante a transmissão. Inclui isReplace e replaceKey:
Nota
Se isReplace estiver definido como true e um campo diferente do campo
Isso ocorre porque os dados a serem gravados contêm registros onde o |
Não |
Nenhum |
|
preSql |
Pré-operação a ser executada antes de gravar dados no MongoDB, como limpar dados históricos. Se preSql estiver vazio, nenhuma pré-operação será configurada. Ao configurar preSql, certifique-se de que seu valor esteja em conformidade com a sintaxe JSON. |
Não |
Nenhum |
Ao executar um job do Data Integration, o preSql configurado é executado primeiro. A fase real de gravação de dados começa somente após a conclusão da execução do preSql. O parâmetro preSql não afeta o conteúdo dos dados gravados. O parâmetro preSql fornece execução idempotente para o Data Integration. Por exemplo, seu preSql pode limpar dados históricos antes de cada execução da tarefa com base nas suas regras de negócios. Nesse caso, se uma tarefa falhar, basta reexecutar o job do Data Integration.
Os requisitos de formato para preSql são os seguintes:
-
Configure o campo type para especifique o tipo de pré-operação. Os valores suportados são drop e remove. Exemplo:
"preSql":{"type":"remove"}.drop: Exclua a coleção e os dados nela contidos. A coleção a ser excluída é especificada pelo parâmetro collectionName.
remove: Exclua dados com base em uma condição.
-
json: Use um objeto JSON para especifique as condições para exclusão de dados. Exemplo:
"preSql":{"type":"remove", "json":"{'operationTime':{'$gte':ISODate('${last_day}T00:00:00.424+0800')}}"}. Neste exemplo,${last_day}é um parâmetro de agendamento do DataWorks no formato$[yyyy-mm-dd]. Também é possível usar outros operadores condicionais suportados pelo MongoDB (como $gt, $lt, $gte e $lte), operadores lógicos (como and e or) ou funções (como max, min, sum, avg e ISODate) conforme necessário.O Data Integration executa a exclusão de dados usando a seguinte API padrão do MongoDB:
query=(BasicDBObject) com.mongodb.util.JSON.parse(json); col.deleteMany(query);NotaPara exclua dados com base em condições, recomendamos o uso da configuração JSON.
-
item: Configure o nome da coluna (name), a condição (condition) e o valor da coluna (value) para filtragem de dados em um item. Exemplo:
"preSql":{"type":"remove","item":[{"name":"pv","value":"100","condition":"$gt"},{"name":"pid","value":"10"}]}.O Data Integration constrói uma condição de consulta com base nas condições de item configuradas e executa a exclusão usando uma API padrão do MongoDB. Por exemplo:
col.deleteMany(query);.
Se o preSql não for reconhecido, nenhuma operação de pré-exclusão será realizada.