Pular para o conteúdo principal
Este guia apresenta padrões comuns para trabalhar com dados JSON replicados do MongoDB para o ClickHouse via ClickPipes. Suponha que tenhamos criado uma coleção t1 no MongoDB para rastrear pedidos de clientes:
O MongoDB CDC Connector replica documentos do MongoDB no ClickHouse usando o tipo de dados JSON nativo. A tabela replicada t1 no ClickHouse conterá a seguinte linha:

Esquema da tabela

As tabelas replicadas usam este esquema padrão:
  • _id: Chave primária do MongoDB
  • doc: Documento do MongoDB replicado como tipo de dado JSON
  • _peerdb_synced_at: Registra quando a linha foi sincronizada pela última vez
  • _peerdb_version: Acompanha a versão da linha; é incrementada quando a linha é atualizada ou excluída
  • _peerdb_is_deleted: Indica se a linha foi excluída

Mecanismo de tabela ReplacingMergeTree

ClickPipes mapeia coleções do MongoDB para o ClickHouse usando a família de mecanismos de tabela ReplacingMergeTree. Com esse mecanismo, as atualizações são modeladas como inserções com uma versão mais recente (_peerdb_version) do documento para uma determinada chave primária (_id), permitindo tratar com eficiência atualizações, substituições e exclusões como inserções versionadas. O ReplacingMergeTree remove duplicatas de forma assíncrona em segundo plano. Para garantir a ausência de duplicatas na mesma linha, use o modificador FINAL. Por exemplo:

Tratamento de exclusões

As exclusões do MongoDB são propagadas como novas linhas marcadas como excluídas usando a coluna _peerdb_is_deleted. Em geral, convém filtrá-las nas consultas:
Você também pode criar uma política em nível de linha para filtrar automaticamente as linhas excluídas, em vez de especificar esse filtro em cada consulta:

Consultando dados JSON

Você pode consultar diretamente campos do JSON usando a sintaxe de ponto:
Query
Result
Ao consultar campos de objetos aninhados com a sintaxe de ponto, certifique-se de adicionar o operador ^:
Query
Result

Tipo Dynamic

No ClickHouse, cada campo em JSON é do tipo Dynamic. O tipo Dynamic permite que o ClickHouse armazene valores de qualquer tipo sem saber o tipo de antemão. Você pode verificar isso com a função toTypeName:
Query
Result
Para verificar os tipos de dados subjacentes de um campo, você pode usar a função dynamicType. Observe que é possível que o mesmo nome de campo tenha tipos de dados diferentes em linhas diferentes:
Query
Result
Funções regulares funcionam com o tipo Dynamic da mesma forma que funcionam com colunas regulares: Exemplo 1: Parsing de datas
Query
Result
Exemplo 2: Lógica condicional
Query
Result
Exemplo 3: operações com Array
Query
Result

Conversão de tipo de campos

As funções de agregação no ClickHouse não funcionam diretamente com o tipo Dynamic. Por exemplo, se você tentar usar a função sum diretamente em um tipo Dynamic, receberá o seguinte erro:
Para usar funções de agregação, converta o campo para o tipo adequado usando a função CAST ou a sintaxe :::
Query
Result
A conversão do tipo Dynamic para o tipo de dado subjacente (determinado por dynamicType) é muito eficiente, pois o ClickHouse já armazena internamente o valor nesse tipo subjacente.

Achatamento de JSON

VIEW normal

Você pode criar VIEWs normais sobre a tabela JSON para encapsular a lógica de achatamento, conversão de tipos e transformação, de modo a consultar os dados como se estivessem em uma tabela relacional. As VIEWs normais são leves porque armazenam apenas a própria consulta, e não os dados subjacentes. Por exemplo:
Esta VIEW terá o seguinte esquema:
Agora você pode consultar a VIEW de maneira semelhante a uma tabela achatada:

VIEW materializada atualizável

Você pode criar VIEWs materializadas atualizáveis, que permitem agendar a execução de consultas para desduplicar linhas e armazenar os resultados em uma tabela de destino desnormalizada. A cada atualização agendada, a tabela de destino é substituída pelos resultados mais recentes da consulta. A principal vantagem desse método é que a consulta com a palavra-chave FINAL é executada apenas uma vez durante a atualização, eliminando a necessidade de usar FINAL nas consultas subsequentes à tabela de destino. Uma desvantagem é que os dados na tabela de destino ficam atualizados apenas até a atualização mais recente. Para muitos casos de uso, intervalos de atualização que vão de vários minutos a algumas horas oferecem um bom equilíbrio entre atualidade dos dados e desempenho das consultas.
Agora você pode consultar diretamente a tabela flattened_t1 sem o modificador FINAL:

VIEW materializada incremental

Se você quiser acessar colunas achatadas em tempo real, pode criar VIEWs materializadas incrementais. Se a sua tabela tiver atualizações frequentes, não é recomendável usar o modificador FINAL na sua VIEW materializada, pois cada atualização acionará um merge. Em vez disso, você pode deduplicar os dados em tempo de consulta criando uma VIEW normal sobre a VIEW materializada.
Agora você pode consultar a VIEW flattened_t1_final da seguinte forma:
Última modificação em 19 de junho de 2026