Data Transmission Service (DTS) prend en charge le traitement ETL (extraction, transformation et chargement) basé sur les flux au sein des tâches de migration et de synchronisation. Vous pouvez configurer ETL pour filtrer les données, masquer les champs sensibles, enregistrer les horodatages de modification et auditer les changements de données à l'aide d'un langage de script DSL.
Informations générales
Lorsque vous devez transformer ou filtrer des données en temps réel avant leur écriture dans la base de données de destination, utilisez la fonctionnalité ETL basée sur les flux de DTS. La logique ETL se définit via un langage de script spécifique au domaine (DSL). Pour une présentation du DSL et de sa syntaxe, consultez Introduction à la syntaxe DSL de traitement des données.
DTS permet de configurer ETL de deux manières :
Les tâches de migration et les tâches de synchronisation DTS prennent toutes deux en charge la configuration ETL. Cette rubrique prend l'exemple des tâches de synchronisation. La méthode de configuration pour les tâches de migration est similaire.
Bases de données prises en charge
Le tableau suivant répertorie les bases de données source et de destination prises en charge pour ETL.
Base de données source | Base de données de destination |
SQL Server |
|
MySQL |
|
Oracle auto-géré |
|
PolarDB for MySQL |
|
PolarDB for PostgreSQL (Compatible with Oracle) |
|
PolarDB-X 1.0 |
|
PolarDB-X 2.0 |
|
Db2 for LUW auto-géré | MySQL |
Db2 for i auto-géré | MySQL |
PolarDB for PostgreSQL |
|
PostgreSQL |
|
TiDB |
|
MongoDB | Lindorm |
Configurer ETL lors de la création d'une tâche de synchronisation
Remarques
Si votre script ETL ajoute de nouvelles colonnes, ajoutez-les manuellement à la base de données de destination. Dans le cas contraire, le script ETL ne prendra pas effet. Par exemple, dans
e_set(, vous devez ajouter manuellementnew_columnà la base de données de destination.Les scripts DSL gèrent uniquement les opérations de transformation et de nettoyage des données. Ils ne permettent pas de créer des objets de base de données.
Les champs référencés dans un script DSL doivent exister dans la base de données source et ne doivent être exclus par aucune condition de filtrage. Sinon, la tâche risque d'échouer.
Les scripts DSL respectent la casse. Les noms de bases de données, de tables et de champs doivent correspondre exactement à ceux de la base de données source.
Les scripts DSL ne prennent pas en charge les expressions multiples. Utilisez la fonction
e_composepour combiner plusieurs expressions en une seule.Toutes les modifications DML provenant de toutes les tables de la base de données source doivent produire des informations de colonnes identiques après le traitement DSL. Autrement, la tâche peut échouer. Par exemple, si vous utilisez la fonction
e_setpour ajouter une colonne, assurez-vous que les opérations INSERT, UPDATE et DELETE de la base de données source aboutissent toutes à la même colonne supplémentaire dans la table de destination. Pour plus d'informations, consultez Enregistrer l'heure de modification des données.
Procédure
Créez une tâche de synchronisation. Pour plus de détails, consultez Présentation des solutions de synchronisation.
À l'étape Advanced Configurations, définissez Configure ETL sur Yes.
-
Dans la zone de saisie, saisissez votre instruction ETL en utilisant la syntaxe DSL de traitement des données.
RemarquePar exemple, pour supprimer les enregistrements dont l'ID est supérieur à 3, utilisez
e_if(op_gt(. Ici,op_gtest une fonction d'expression qui vérifie si une valeur est supérieure à une autre, etidest une variable. Ce script filtre les enregistrements où id > 3. Terminez les étapes restantes selon vos besoins.
Modifier la configuration ETL d'une tâche de synchronisation existante
La modification de la configuration ETL d'une tâche de synchronisation existante comprend les cas suivants :
Si vous disposez d'une tâche de synchronisation existante sans configuration ETL (c'est-à-dire que lors de sa création, Configure ETL était défini sur No), vous pouvez passer No à Yes et configurer un script DSL.
-
Si ETL était déjà configuré, vous pouvez modifier le script DSL existant ou définir Configure ETL sur No.
ImportantPour modifier un script DSL existant, déplacez d'abord l'objet de synchronisation depuis Selected Objects vers Source Objects, puis rajoutez-le à Selected Objects avant de modifier le script DSL.
Les tâches de migration ne prennent pas en charge la modification des scripts DSL.
Remarques
La modification de la configuration ETL d'une tâche de synchronisation existante ne permet pas de changer le schéma de table dans la base de données de destination. Pour modifier le schéma, effectuez cette opération dans la base de données de destination avant de démarrer la tâche de synchronisation.
La modification de la configuration ETL peut interrompre la liaison de données. Procédez avec prudence.
Les changements de configuration ETL s'appliquent uniquement aux données incrémentielles traitées après le redémarrage de la tâche. Ils n'affectent pas les données historiques traitées avant la modification.
Les scripts DSL gèrent uniquement les opérations de transformation et de nettoyage des données. Ils ne permettent pas de créer des objets de base de données.
Les champs référencés dans un script DSL doivent exister dans la base de données source et ne doivent être exclus par aucune condition de filtrage. Sinon, la tâche risque d'échouer.
Les scripts DSL respectent la casse. Les noms de bases de données, de tables et de champs doivent correspondre exactement à ceux de la base de données source.
Les scripts DSL ne prennent pas en charge les expressions multiples. Utilisez la fonction
e_composepour combiner plusieurs expressions en une seule.Toutes les modifications DML provenant de toutes les tables de la base de données source doivent produire des informations de colonnes identiques après le traitement DSL. Autrement, la tâche peut échouer. Par exemple, si vous utilisez la fonction
e_setpour ajouter une colonne, assurez-vous que les opérations INSERT, UPDATE et DELETE de la base de données source aboutissent toutes à la même colonne supplémentaire dans la table de destination. Pour plus d'informations, consultez Enregistrer l'heure de modification des données.
Procédure
Connectez-vous à la page de liste des nouvelles tâches de synchronisation DTS.
Sur la tâche de synchronisation cible, cliquez sur
et sélectionnez Modify ETL Configurations.À l'étape Advanced Configurations, définissez Configure ETL sur Yes.
-
Dans la zone de saisie, saisissez votre instruction ETL en utilisant la syntaxe DSL de traitement des données.
RemarquePar exemple, pour supprimer les enregistrements dont l'ID est supérieur à 3, utilisez
e_if(op_gt(. Ici,op_gtest une fonction d'expression qui vérifie si une valeur est supérieure à une autre, etidest une variable. Ce script filtre les enregistrements où id > 3. Terminez les étapes restantes selon vos besoins.
Introduction à la syntaxe DSL de traitement des données
Le DSL de traitement des données est un langage de script permettant de définir la logique ETL dans les scénarios de synchronisation DTS. Il prend en charge les fonctions conditionnelles et gère les chaînes, les dates et les valeurs numériques avec les caractéristiques suivantes :
Fonctionnalités puissantes : offre de nombreuses fonctions et permet la composition de fonctions.
Syntaxe relativement simple : inclut des exemples pour les scénarios courants tels que le filtrage, la transformation et le masquage des données. Pour plus de détails, consultez Exemples de scénarios typiques.
Haute efficacité d'exécution : utilise la technologie de génération de code pour minimiser l'impact sur les performances du processus de synchronisation.
Dans la syntaxe DSL, les noms de colonnes utilisent des accents graves (``), et non des guillemets simples ('').
Ce produit fait référence à la syntaxe de traitement des données SLS. Il prend en charge les fonctions JSON mais pas les fonctions de fractionnement d'événements. Pour la syntaxe SLS, consultez Introduction à la syntaxe.
Exemples de scénarios typiques
Filtrage des données
Filtrage par colonne numérique : supprimez les enregistrements où id > 10 000 afin qu'ils ne soient pas synchronisés : e_if(op_gt(
id, 10000), e_drop()).Filtrage par correspondance de chaîne : supprimez les enregistrements où name contient « hangzhou » : e_if(str_contains(
name, "hangzhou"), e_drop()).Filtrage par date : ne synchronisez pas les enregistrements dont order_timestamp est antérieur à une heure spécifique : e_if(op_lt(
order_timestamp, "2015-02-23 23:54:55"), e_drop()).-
Filtrage par conditions multiples :
Supprimez les enregistrements où id > 1 000 et name contient « hangzhou » : e_if(op_and(str_contains(
name, "hangzhou"), op_gt(id, 1000)), e_drop()).Supprimez les enregistrements où id > 1 000 ou name contient « hangzhou » : e_if(op_or(str_contains(
name, "hangzhou"), op_gt(id, 1000)), e_drop()).
Masquage des données
Masquage : remplacez les quatre derniers chiffres de la colonne phone par des astérisques : e_set(phone, str_mask(phone, 7, 10, '*')).
Enregistrer l'heure de modification des données
-
Ajouter une colonne à toutes les tables : lorsque __OPERATION__ est INSERT, UPDATE ou DELETE, ajoutez une colonne nommée « dts_sync_time » avec la valeur de l'horodatage de validation du journal (__COMMIT_TIMESTAMP__).
e_if(op_or(op_or( op_eq(__OPERATION__, __OP_INSERT__), op_eq(__OPERATION__, __OP_UPDATE__)), op_eq(__OPERATION__, __OP_DELETE__)), e_set(dts_sync_time, __COMMIT_TIMESTAMP__)) -
Ajouter une colonne à une table spécifique « dts_test_table » : lorsque __OPERATION__ est INSERT, UPDATE ou DELETE, ajoutez une colonne nommée « dts_sync_time » avec la valeur de l'horodatage de validation du journal (__COMMIT_TIMESTAMP__).
e_if(op_and( op_eq(__TB__,'dts_test_table'), op_or(op_or( op_eq(__OPERATION__,__OP_INSERT__), op_eq(__OPERATION__,__OP_UPDATE__)), op_eq(__OPERATION__,__OP_DELETE__))), e_set(dts_sync_time,__COMMIT_TIMESTAMP__))RemarqueVous devez ajouter manuellement la colonne « dts_sync_time » à la table de destination avant de démarrer la tâche.
Audit des changements de données
Enregistrez le type et l'heure des changements de données : écrivez le type de changement dans la colonne « operation_type » et l'horodatage du changement dans la colonne « updated » de la base de données de destination.
e_compose(
e_switch(
op_eq(__OPERATION__,__OP_DELETE__), e_set(operation_type, 'DELETE'),
op_eq(__OPERATION__,__OP_UPDATE__), e_set(operation_type, 'UPDATE'),
op_eq(__OPERATION__,__OP_INSERT__), e_set(operation_type, 'INSERT')),
e_set(updated, __COMMIT_TIMESTAMP__),
e_set(__OPERATION__,__OP_INSERT__)
)
Vous devez ajouter les colonnes « operation_type » et « updated » à la table de destination avant de démarrer la tâche.
Distinguer les données complètes et incrémentielles
Enregistrez si les données proviennent d'une migration complète ou incrémentielle dans la colonne is_increment_dml. Vous pouvez faire la distinction entre migration complète et incrémentielle en vérifiant la valeur de __COMMIT_TIMESTAMP__. Lors d'une migration complète, __COMMIT_TIMESTAMP__ vaut 0 (1970-01-01 08:00:00, selon le fuseau horaire). Lors d'une migration incrémentielle, cette valeur reflète l'heure d'écriture du journal de la base de données source. Le script ETL correspondant est le suivant :
e_if_else(__COMMIT_TIMESTAMP__ > DATETIME('2000-01-01 00:00:00'),
e_set(`is_increment_dml`, True),
e_set(`is_increment_dml`, False)
)
Syntaxe DSL de traitement des données
Constantes et variables
-
Constantes
Type
Exemple
int
123
float
123,4
string
"hello1_world"
boolean
true or false
datetime
DATETIME('2021-01-01 10:10:01')
-
Variables
Variable
Description
Type de données
Valeur d'exemple
__TB__
Nom de la table
string
table
__DB__
Nom de la base de données
string
mydb
__OPERATION__
Type d'opération
string
__OP_INSERT__, __OP_UPDATE__, __OP_DELETE__
__BEFORE__
Valeur pré-image pour les opérations UPDATE (valeur avant modification)
RemarqueLes opérations DELETE ne comportent que des valeurs pré-image.
Marqueur spécial, sans type
v(
column_name,__BEFORE__)__AFTER__
Valeur post-image pour les opérations UPDATE (valeur après modification)
RemarqueLes opérations INSERT ne comportent que des valeurs post-image.
Marqueur spécial, sans type
v(
column_name,__AFTER__)__COMMIT_TIMESTAMP__
Heure de validation de la transaction
datetime
'2021-01-01 10:10:01'
columnValeur de la colonne spécifiée pour un enregistrement
string
id,name
Fonctions d'expression
-
Opérations numériques
Fonction
Syntaxe
Plage de valeurs
Valeur de retour
Exemple
Addition
op_sum(value1, value2)
value1 : nombre entier ou à virgule flottante
value2 : nombre entier ou à virgule flottante
Renvoie un entier si les deux paramètres sont des entiers ; sinon, renvoie un nombre à virgule flottante.
op_sum(
col1, 1,0)Soustraction
op_sub(value1, value2)
value1 : nombre entier ou à virgule flottante
value2 : nombre entier ou à virgule flottante
Renvoie un entier si les deux paramètres sont des entiers ; sinon, renvoie un nombre à virgule flottante.
op_sub(
col1, 1,0)Multiplication
op_mul(value1, value2)
value1 : nombre entier ou à virgule flottante
value2 : nombre entier ou à virgule flottante
Renvoie un entier si les deux paramètres sont des entiers ; sinon, renvoie un nombre à virgule flottante.
op_mul(
col1, 1,0)Division
op_div_true(value1, value2)
value1 : nombre entier ou à virgule flottante
value2 : nombre entier ou à virgule flottante
Renvoie un entier si les deux paramètres sont des entiers ; sinon, renvoie un nombre à virgule flottante.
op_div_true(
col1, 2,0) ; si col1=15, renvoie 7,5.Opération modulo
op_mod(value1, value2)
value1 : nombre entier ou à virgule flottante
value2 : nombre entier ou à virgule flottante
Renvoie un entier si les deux paramètres sont des entiers ; sinon, renvoie un nombre à virgule flottante.
op_mod(
col1, 10) ; si col1=23, renvoie 3. -
Opérations logiques
Fonction
Syntaxe
Valeurs valides
Valeur de retour
Exemple
Vérification d'égalité
op_eq(value1, value2)
value1 : entier, nombre à virgule flottante ou chaîne
value2 : entier, nombre à virgule flottante ou chaîne
Booléen : true ou false
op_eq(
col1, 23)Vérification de supériorité
op_gt(value1, value2)
value1 : entier, nombre à virgule flottante ou chaîne
value2 : entier, nombre à virgule flottante ou chaîne
Booléen : true ou false
op_gt(
col1, 1,0)Est inférieur à
op_lt(value1, value2)
value1 : entier, nombre à virgule flottante ou chaîne
value2 : entier, nombre à virgule flottante ou chaîne
Booléen : true ou false
op_lt(
col1, 1,0)Vérification de supériorité ou d'égalité
op_ge(value1, value2)
value1 : entier, nombre à virgule flottante ou chaîne
value2 : entier, nombre à virgule flottante ou chaîne
Booléen : true ou false
op_ge(
col1, 1,0)Vérification d'infériorité ou d'égalité
op_le(value1, value2)
value1 : entier, nombre à virgule flottante ou chaîne
value2 : entier, nombre à virgule flottante ou chaîne
Booléen : true ou false
op_le(
col1, 1,0)Opération ET
op_and(value1, value2)
value1 : booléen
value2 : booléen
Booléen : true ou false
op_and(
is_male,is_student)Opération OU
op_or(value1, value2)
value1 : booléen
value2 : booléen
Booléen : true ou false
op_or(
is_male,is_student)Opération IN
op_in(value, json_array)
value : tout type
json_array : chaîne au format JSON
Booléen : true ou false
op_in(
id,json_array('["0","1","2","3","4","5","6","7","8"]'))Vérifier si la valeur est nulle
op_is_null(value)
value : tout type
Booléen : true ou false
op_is_null(
name)Vérifier si la valeur n'est pas nulle
op_is_not_null(value)
value : tout type
Booléen : true ou false
op_is_not_null(
name) -
Fonctions de chaîne
Fonction
Syntaxe
Plage de valeurs
Valeur de retour
Exemple
Concaténation de chaînes
op_add(str_1,str_2,...,str_n)
str_1 : chaîne
str_2 : chaîne
...
str_n : chaîne
Chaîne concaténée
op_add(
col,'hangzhou','dts')Formatage et concaténation de chaînes
str_format(format, value1, value2, value3, ...)
format : chaîne avec des accolades comme espaces réservés, par exemple "part1: {}, part2: {}"
value1 : tout type
value2 : tout type
Chaîne formatée
str_format("part1: {}, part2: {}",
col1,col2) ; si col1="ab" et col2="12", renvoie "part1: ab, part2: 12".Remplacement de chaîne
str_replace(original, oldStr, newStr, count)
original : chaîne d'origine
oldStr : chaîne à remplacer
newStr : chaîne de remplacement
count : entier, nombre maximal de remplacements. Définissez -1 pour toutes les occurrences.
Chaîne remplacée
str_replace(
name, "a", 'b', 1) ; si name="aba", renvoie "bba". str_replace(name, "a", 'b', -1) ; si name="aba", renvoie "bbb".Remplacer les valeurs dans tous les champs de type chaîne (tels que varchar, text, char)
tail_replace_string_field(search, replace, all)
search : chaîne à remplacer
replace : chaîne de remplacement
all : indique s'il faut remplacer toutes les correspondances ; prend actuellement en charge uniquement true.
RemarqueSi vous ne souhaitez pas remplacer toutes les correspondances, utilisez la fonction
str_replace.
Chaîne remplacée
tail_replace_string_field('\u000f', '', true) remplace toutes les occurrences de "\u000f" dans les valeurs des champs de type chaîne par un espace.
Supprimer les caractères spécifiés au début et à la fin de la chaîne
str_strip(string_val, charSet)
string_val : chaîne d'origine
char_set : ensemble de caractères à supprimer
Chaîne avec les caractères de début et de fin supprimés
str_strip(
name, 'ab') ; si name=axbzb, renvoie xbz.Convertir la chaîne en minuscules
str_lower(value)
value : colonne de chaîne ou littéral de chaîne
Chaîne en minuscules
str_lower(
str_col)Convertir la chaîne en majuscules
str_upper(value)
value : colonne de chaîne ou littéral de chaîne
Chaîne en majuscules
str_upper(
str_col)Convertir une chaîne en nombre
cast_string_to_long(value)
value : chaîne
Entier
cast_string_to_long(
col)Convertir un nombre en chaîne
cast_long_to_string(value)
value : entier
Chaîne
cast_long_to_string(
col)Compter les occurrences d'une sous-chaîne
str_count(str,pattern)
str : colonne de chaîne ou littéral de chaîne
pattern : sous-chaîne à rechercher
Nombre d'apparitions de la sous-chaîne
str_count(
str_col, 'abc') ; si str_col="zabcyabcz", renvoie 2.Trouver la position d'une sous-chaîne
str_find(str, pattern)
str : colonne de chaîne ou littéral de chaîne
pattern : sous-chaîne à rechercher
Position de la première correspondance ; renvoie
-1si aucune correspondance n'est trouvéestr_find(
str_col, 'abc') ; sistr_col="xabcy", renvoie1.Vérifier si la chaîne contient uniquement des lettres
str_isalpha(str)
str : colonne de chaîne ou littéral de chaîne
true ou false
str_isalpha(
str_col)Vérifier si la chaîne contient uniquement des chiffres
str_isdigit(str)
str : colonne de chaîne ou littéral de chaîne
true ou false
str_isdigit(
str_col)Correspondance d'expression régulière
regex_match(str,regex)
str : colonne de chaîne ou littéral de chaîne
regex : colonne de chaîne d'expression régulière ou littéral de chaîne
true ou false
regex_match(__TB__,'user_\\d+')
Masquer une partie d'une chaîne avec un caractère spécifié pour l'anonymisation des données, par exemple remplacer les quatre derniers chiffres d'un numéro de téléphone par des astérisques
str_mask(str, start, end, maskStr)
str : colonne de chaîne ou littéral de chaîne
start : entier, position de départ du masquage (minimum 0)
end : entier, position de fin du masquage (longueur maximale de la chaîne moins un)
maskStr : chaîne à caractère unique, telle que '#'
Chaîne avec les caractères masqués de start à end
str_mask(
phone, 7, 10, '#')Extraire la partie de la chaîne après cond
substring_after(str, cond)
str : chaîne d'origine
cond : chaîne
Chaîne
RemarqueLe résultat n'inclut pas cond.
substring_after(
col, 'abc')Extraire la partie de la chaîne avant cond
substring_before(str, cond)
str : chaîne d'origine
cond : chaîne
Chaîne
RemarqueLe résultat n'inclut pas cond.
substring_before(
col, 'efg')Extraire la partie de la chaîne entre cond1 et cond2
substring_between(str, cond1, cond2)
str : chaîne d'origine
cond1 : chaîne
cond2 : chaîne
Chaîne
RemarqueLe résultat n'inclut ni cond1 ni cond2.
substring_between(
col, 'abc','efg')Vérifier si la valeur est de type chaîne
is_string_value(value)
value : chaîne ou nom de colonne
Booléen : true ou false
is_string_value(
col1)Remplacer le contenu dans les champs de type chaîne ; commence par la fin dans l'ordre inverse
tail_replace_string_field(search, replace, all)
search : chaîne à remplacer
replace : chaîne de remplacement
all : indique s'il faut tout remplacer ; true ou false
Chaîne remplacée
Remplace "\u000f" par un espace dans toutes les valeurs de champ de chaîne.
tail_replace_string_field('\u000f','',true)
Obtenir la valeur d'un champ dans MongoDB
bson_value("field1","field2","field3",...)
field1 : nom de champ de premier niveau
field2 : nom de champ de deuxième niveau
Valeur du champ spécifié dans le document
e_set(
user_id, bson_value("id"))e_set(
user_name, bson_value("person","name"))
-
Fonctions de date et d'heure
Fonction
Syntaxe
Plage de valeurs
Valeur de retour
Exemple
Heure système actuelle
dt_now()
Aucun
DATETIME, précise à la seconde
dts_now()
dt_now_millis()
Aucun
DATETIME, précise à la milliseconde
dt_now_millis()
Convertir un horodatage UTC (secondes) en DATETIME
dt_fromtimestamp(value,[timezone])
value : entier
timezone : fuseau horaire (facultatif)
DATETIME, précise à la seconde
dt_fromtimestamp(1626837629)
dt_fromtimestamp(1626837629,'GMT+08')
Convertir un horodatage UTC (millisecondes) en DATETIME
dt_fromtimestamp_millis(value,[timezone])
value : entier
timezone : fuseau horaire (facultatif)
DATETIME, précise à la milliseconde
dt_fromtimestamp_millis(1626837629123) ;
dt_fromtimestamp_millis(1626837629123,'GMT+08')
Convertir DATETIME en horodatage UTC (secondes)
dt_parsetimestamp(value,[timezone])
value : DATETIME
timezone : fuseau horaire (facultatif)
Entier
dt_parsetimestamp(
datetime_col)dt_parsetimestamp(
datetime_col,'GMT+08')Convertir DATETIME en horodatage UTC (millisecondes)
dt_parsetimestamp_millis(value,[timezone])
value : DATETIME
timezone : fuseau horaire (facultatif)
Entier
dt_parsetimestamp_millis(
datetime_col)dt_parsetimestamp_millis(
datetime_col,'GMT+08')Convertir DATETIME en chaîne
dt_str(value, format)
value : DATETIME
format : chaîne au format yyyy-MM-dd HH:mm:ss
Chaîne
dt_str(
col1, 'yyyy-MM-dd HH:mm:ss')Convertir une chaîne en DATETIME
dt_strptime(value,format)
value : chaîne
format : chaîne au format yyyy-MM-dd HH:mm:ss
DATETIME
dt_strptime('2021-07-21 03:20:29', 'yyyy-MM-dd hh:mm:ss')
Ajuster l'heure en ajoutant ou soustrayant des années, mois, jours, heures, minutes ou secondes
dt_add(value, [years=intVal],
[months=intVal],
[days=intVal],
[hours=intVal],
[minutes=intVal]
)
value : DATETIME
intVal : entier
RemarqueLe signe moins (−) indique une soustraction.
DATETIME
dt_add(datetime_col,years=-1)
dt_add(datetime_col,years=1,months=1)
-
Expressions conditionnelles
Fonction
Syntaxe
Plage de valeurs
Valeur de retour
Exemple
Similaire à l'opérateur ternaire (
? :) en C, renvoie une valeur basée sur une condition(cond ? val_1 : val_2)
cond : champ ou expression booléenne
val_1 : valeur de retour 1
val_2 : valeur de retour 2
Remarqueval_1 et val_2 doivent être du même type.
Renvoie val_1 si cond est vrai ; sinon, renvoie val_2
(id>1000? 1 : 0)
-
Fonctions JSON
RemarqueLe type value représente n'importe quel type de champ dans la base de données.
Fonction
Syntaxe
Plage de valeurs
Valeur de retour
Exemple
Convertir une chaîne de tableau JSON en Set
json_array(arrayText)
RemarqueNe peut être utilisé que dans des expressions renvoyant un booléen.
arrayText : chaîne, la chaîne de tableau JSON à convertir
Set
op_in(renvoie le Setid,json_array('["0","1","2","3"]'))["0","1","2","3"].Créer un tableau JSON avec des données spécifiées
json_array2(item...)
item... : type value, données pour le tableau JSON
Tableau JSON
json_array2("0","1","2","3")renvoie["0","1","2","3"].Créer un objet JSON avec des données spécifiées
json_object(item...)
item... : données d'un objet JSON (paires clé-valeur), composées d'un nom de clé (chaîne) et d'une valeur de clé (type value), séparés par une virgule (,).
JSON
json_object('name','ZhangSan','age',32, 'loginId',100)renvoie{"name":"ZhangSan","age":32,"loginId":100}.Insérer des données à une position spécifiée (tableau) dans un objet JSON
json_array_insert(json, kvPairs...)
json : chaîne, l'objet JSON à modifier
kvPairs... : données à insérer. Chaque paire consiste en un JSONPath (chaîne) et une valeur (type value), séparés par une virgule.
JSON
RemarqueSi la position spécifiée n'existe pas, renvoie l'objet JSON d'origine.
Si l'élément à la position spécifiée n'existe pas, les données sont ajoutées à la fin du tableau cible.
json_array_insert('{"Address":["City",1]}','$.Address[3]',100)renvoie{"Address":["City",1,100]}.Insérer des données à une position spécifiée dans un objet JSON
json_insert(json, kvPairs...)
json : chaîne, l'objet JSON à modifier
kvPairs... : données à insérer. Chaque paire consiste en un JSONPath (chaîne) et une valeur (type value), séparés par une virgule.
JSON
RemarqueSi l'emplacement spécifié existe, le système renvoie l'objet JSON à traiter.
Si la position spécifiée n'existe pas, les données sont ajoutées à l'objet JSON.
json_insert('{"Address":["City","Xian","Number",1]}','$.ID',100)renvoie{"Address":["City","Xian","Number",1],"ID":100}.Insérer ou mettre à jour des données à une position spécifiée dans un objet JSON
json_set(json, kvPairs...)
json : chaîne, l'objet JSON à modifier
kvPairs... : données à insérer ou mettre à jour. Chaque paire consiste en un JSONPath (chaîne) et une valeur (type value), séparés par une virgule.
type value
RemarqueSi la position spécifiée existe, met à jour les données.
Si la position spécifiée n'existe pas, ajoute les données à l'objet JSON.
json_set('{"ID":1,"Address":["City","Xian","Number",1]}',"$.IP",100)renvoie{"ID":1,"Address":["City","Xian","Number",1], "IP":100}.Insérer ou mettre à jour une paire clé-valeur dans un objet JSON
json_put(json, key, value)
json : chaîne, l'objet JSON à modifier
key : chaîne, le nom de clé à insérer ou mettre à jour
value : type value, la valeur pour la clé
JSON
RemarqueSi json n'est pas un objet JSON, renvoie null.
Si la clé existe, met à jour sa valeur.
Si la clé n'existe pas, l'ajoute à l'objet JSON.
json_put('{"loginId":100}','loginTime','2024-10-10')renvoie{"loginId":100, "loginTime":"2024-10-10"}.Remplacer des données à une position spécifiée dans un objet JSON
json_replace(json, kvPairs...)
json : chaîne, l'objet JSON à modifier
kvPairs... : données à remplacer. Chaque paire consiste en un JSONPath (chaîne) et une valeur (type value), séparés par une virgule.
type value
RemarqueSi la position spécifiée n'existe pas, renvoie l'objet JSON d'origine.
json_replace('{"ID":1,"Address":["City","Xian","Number",1]}',"$.IP",100)renvoie{"ID":1,"Address":["City","Xian","Number",1]}.Vérifier si des données spécifiées existent à une position dans un objet JSON
json_contains(json, jsonPath, item)
json : chaîne, l'objet JSON à interroger
jsonPath : chaîne, la position dans l'objet JSON
item : type value, les données à rechercher
Booléen : true ou false
json_contains('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID',1)renvoietrue.Vérifier si une position spécifiée existe dans un objet JSON.
json_contains_path(json, jsonPath)
json : chaîne, l'objet JSON à interroger
jsonPath : chaîne, la position à vérifier
Booléen : true ou false
json_contains_path('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID')renvoietrue.Obtenir des données d'une position spécifiée dans un objet JSON
json_extract(json, jsonPath)
json : chaîne, l'objet JSON à interroger
jsonPath : chaîne, la position dans l'objet JSON
type value
json_extract('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID')renvoie1.Obtenir la valeur d'une clé spécifiée dans un objet JSON
json_get(json, key)
json : chaîne, l'objet JSON à interroger
key : chaîne, le nom de la clé
type value
json_get('{"ID":1,"Address":["City","Xian","Number",1]}','ID')renvoie1.Obtenir toutes les clés à une position spécifiée dans un objet JSON
json_keys(json, jsonPath)
json : chaîne, l'objet JSON à interroger
jsonPath : chaîne, la position dans l'objet JSON
Tableau JSON
json_keys('{"ID":1,"Address":["City","Xian","Number",1]}','$')renvoie["ID","Address"].Obtenir la longueur (nombre de clés) à une position spécifiée dans un objet JSON
json_length(json, jsonPath)
json : chaîne, l'objet JSON à interroger
jsonPath : chaîne, la position dans l'objet JSON
RemarqueSi jsonPath est
"$", cela équivaut àjson_length(json).
Entier
json_length('{"ID":1,"Address":["City","Xian","Number",1]}','$')renvoie2.Obtenir la longueur (nombre de clés) à la racine d'un objet JSON
json_length(json)
json : chaîne, l'objet JSON à interroger
Entier
json_length('{"ID":1,"Address":["City","Xian","Number",1]}')renvoie2.Analyser une chaîne JSON en objet JSON
json_parse(json)
json : chaîne, la chaîne JSON à analyser
type value
json_parse('{"ID":1,"Address":["City","Xian","Number",1]}')renvoie{"ID":1,"Address":["City","Xian","Number",1]}.Supprimer des données d'une position spécifiée dans un objet JSON
json_remove(json, jsonPath)
json : chaîne, l'objet JSON à modifier
jsonPath : chaîne, la position dans l'objet JSON
JSON
json_remove('{"loginId":100, "loginTime":"2024-10-10"}','$.loginTime')renvoie{"loginId":100}.
Fonctions globales
-
Fonctions de contrôle de flux
Fonction
Syntaxe
Paramètres
Exemple
Instruction if
e_if(bool_expr, func_invoke)
bool_expr : constante booléenne ou appel de fonction. Constantes : true ou false. Exemple d'appel de fonction : op_gt(
id, 10).func_invoke : appel de fonction. Fonctions prises en charge : e_drop, e_keep, e_set, e_if, e_compose.
e_if(op_gt(
id, 10), e_drop()) ; supprime l'enregistrement si l'ID > 10.Instruction if-else
e_if_else(bool_expr, func_invoke1, func_invoke2)
bool_expr : constante booléenne ou appel de fonction. Constantes : true ou false. Exemple d'appel de fonction : op_gt(
id, 10).func_invoke1 : appel de fonction exécuté si la condition est vraie.
func_invoke2 : appel de fonction exécuté si la condition est fausse.
e_if_else(op_gt(
id, 10), e_set(tag, 'large'), e_set(tag, 'small')) ; définit le tag à « large » si l'ID > 10, sinon à « small ».Instruction de type switch évaluant plusieurs conditions et exécutant la première opération correspondante. Une opération par défaut s'exécute si aucune condition ne correspond.
s_switch(condition1, func1, condition2, func2, ..., default=default_func)
condition1 : constante booléenne ou appel de fonction. Constantes : true ou false. Exemple d'appel de fonction : op_gt(
id, 10).func_invoke : appel de fonction. Évalue condition1 ; si vraie, exécute cette fonction et quitte le switch. Si fausse, passe à la condition suivante.
default_func : appel de fonction exécuté si toutes les conditions sont fausses.
e_switch(op_gt(
id, 100), e_set(str_col, '>100'), op_gt(id, 90), e_set(str_col, '>90'), default=e_set(str_col, '<=90')).Combinaison de plusieurs opérations
e_compose(func1, func2, func3, ...)
func1 : appel de fonction. Peut être e_set, e_drop ou e_if.
func2 : appel de fonction. Peut être e_set, e_drop ou e_if.
e_compose(e_set(
str_col, 'test'), e_set(dt_col, dt_now())) ; définit str_col à « test » et dt_col à l'heure actuelle. -
Fonctions de manipulation des données
Fonction
Syntaxe
Paramètres
Exemple
Supprimer cet enregistrement (ne pas synchroniser)
e_drop()
Aucun
e_if(op_gt(
id, 10), e_drop()) ; supprime les enregistrements dont l'ID > 10.Conserver cet enregistrement (synchroniser vers la destination)
e_keep(condition)
condition : expression booléenne
e_keep(op_gt(id, 1)) ; synchronise uniquement les enregistrements dont l'ID > 1.
Définir la valeur d'une colonne
e_set(
col, val, NEW)col : nom de la colonne
val : constante ou appel de fonction. Doit correspondre au type de données de col.
NEW : convertit col au type de données de val (facultatif)
ImportantSi vous omettez NEW, n'incluez pas la virgule précédente. Assurez-vous de la compatibilité des types de données pour éviter des erreurs de tâche.
e_set(
dt_col, dt_now()) ; définit dt_col à l'heure actuelle.e_set(
col1,col2+ 1) ; définit col1 à col2 + 1.e_set(
col1, 1, NEW) ; convertit col1 en type numérique et lui attribue la valeur 1.
Conservation, suppression et mappage des noms de champs MongoDB
e_expand_bson_value('*', 'fieldA',{"fieldB":"fieldC"})
: noms de champs à conserver ; signifie tous les champs.
fieldA : noms de champs à supprimer.
{"fieldB":"fieldC"} : mappage des noms de champs ; fieldB est le nom du champ source, fieldC est le nom du champ de destination.
RemarqueLe mappage des noms de champs est facultatif.
e_expand_bson_value("*", "_id,name") ; écrit tous les champs sauf _id et name vers la destination.