Passer au contenu principal
Ce guide présente des cas d’usage courants pour travailler avec des données JSON répliquées de MongoDB vers ClickHouse via ClickPipes. Supposons que nous ayons créé une collection t1 dans MongoDB pour suivre les commandes des clients :
Le connecteur CDC MongoDB réplique des documents de MongoDB dans ClickHouse à l’aide du type de données JSON natif. La table répliquée t1 dans ClickHouse contiendra la ligne suivante :

Schéma de la table

Les tables répliquées utilisent ce schéma standard :
  • _id : Clé primaire de MongoDB
  • doc : document MongoDB répliqué au format de type de données JSON
  • _peerdb_synced_at : Indique quand la ligne a été synchronisée pour la dernière fois
  • _peerdb_version : Suit la version de la ligne ; incrémentée lorsque la ligne est mise à jour ou supprimée
  • _peerdb_is_deleted : Indique si la ligne est supprimée

Moteur de table ReplacingMergeTree

ClickPipes fait correspondre les collections MongoDB à ClickHouse à l’aide de la famille de moteurs de table ReplacingMergeTree. Avec ce moteur, les mises à jour sont modélisées comme des insertions avec une version plus récente (_peerdb_version) du document pour une clé primaire donnée (_id), ce qui permet de gérer efficacement les mises à jour, les remplacements et les suppressions sous forme d’insertions versionnées. ReplacingMergeTree supprime les doublons de manière asynchrone, en tâche de fond. Pour garantir l’absence de doublons pour une même ligne, utilisez le modificateur FINAL. Par exemple :

Gestion des suppressions

Les suppressions dans MongoDB sont répercutées sous forme de nouvelles lignes marquées comme supprimées à l’aide de la colonne _peerdb_is_deleted. En général, vous voudrez les exclure de vos requêtes à l’aide d’un filtre :
Vous pouvez également créer une politique d’accès au niveau des lignes pour exclure automatiquement les lignes supprimées au lieu de spécifier le filtre dans chaque requête :

Interroger des données JSON

Vous pouvez interroger directement les champs JSON à l’aide de la notation pointée :
Query
Result
Lorsque vous interrogez des champs d’objets imbriqués à l’aide de la notation par points, veillez à ajouter l’opérateur ^ :
Query
Result

Type Dynamic

Dans ClickHouse, chaque champ d’un JSON est de type Dynamic. Le type Dynamic permet à ClickHouse de stocker des valeurs de n’importe quel type sans connaître ce type à l’avance. Vous pouvez le vérifier avec la fonction toTypeName :
Query
Result
Pour examiner les types de données sous-jacents d’un champ, vous pouvez utiliser la fonction dynamicType. Notez qu’il est possible d’avoir différents types de données pour un même nom de champ d’une ligne à l’autre :
Query
Result
Fonctions régulières s’appliquent au type Dynamic comme aux colonnes ordinaires : Exemple 1 : analyse syntaxique du type Date
Query
Result
Exemple 2 : Logique conditionnelle
Query
Result
Exemple 3 : opérations sur le type Array
Query
Result

Conversion de type d’un champ

Les fonctions d’agrégation de ClickHouse ne fonctionnent pas directement avec le type Dynamic. Par exemple, si vous essayez d’utiliser directement la fonction sum sur un type Dynamic, vous obtenez l’erreur suivante :
Pour utiliser des fonctions d’agrégation, convertissez le champ au type approprié avec la fonction CAST ou la syntaxe :: :
Query
Result
La conversion du type Dynamic vers le type de données sous-jacent (déterminé par dynamicType) est très performante, car ClickHouse stocke déjà la valeur en interne dans ce type sous-jacent.

Mise à plat du JSON

Vue standard

Vous pouvez créer des vues standard sur la table JSON afin d’encapsuler la logique d’aplatissement, de transtypage et de transformation, pour interroger les données comme dans une table relationnelle. Les vues standard sont légères, car elles stockent uniquement la requête elle-même, et non les données sous-jacentes. Par exemple :
Cette vue aura le schéma suivant :
Vous pouvez maintenant interroger la vue, comme vous le feriez pour une table mise à plat :

Vue matérialisée actualisable

Vous pouvez créer des vues matérialisées actualisables, qui vous permettent de planifier l’exécution de requêtes afin de dédupliquer les lignes et de stocker les résultats dans une table de destination mise à plat. À chaque actualisation planifiée, la table de destination est remplacée par le résultat le plus récent de la requête. Le principal avantage de cette méthode est que la requête utilisant le mot-clé FINAL ne s’exécute qu’une seule fois lors de l’actualisation, ce qui évite d’avoir à utiliser FINAL dans les requêtes suivantes sur la table de destination. L’inconvénient est que les données de la table de destination ne sont à jour qu’à hauteur de la dernière actualisation. Pour de nombreux cas d’usage, des intervalles d’actualisation de quelques minutes à quelques heures offrent un bon équilibre entre fraîcheur des données et performances des requêtes.
Vous pouvez désormais interroger la table flattened_t1 directement, sans le modificateur FINAL :

Vue matérialisée incrémentielle

Si vous souhaitez accéder aux colonnes mises à plat en temps réel, vous pouvez créer des vues matérialisées incrémentielles. Si votre table est fréquemment mise à jour, il n’est pas recommandé d’utiliser le modificateur FINAL dans votre vue matérialisée, car chaque mise à jour déclenchera une opération de fusion. À la place, vous pouvez dédupliquer les données au moment de la requête en créant une vue standard au-dessus de la vue matérialisée.
Vous pouvez maintenant exécuter une requête sur la vue flattened_t1_final comme suit :
Dernière modification le 3 juillet 2026