Data Transmission Service (DTS) は、移行タスクおよび同期タスク内でのストリームベースの ETL (抽出・変換・書き出し) 処理をサポートしています。DSL (ドメイン特化言語) スクリプト言語を使用して ETL を設定し、データのフィルタリング、機密フィールドのマスキング、変更タイムスタンプの記録、データ変更の監査を行うことができます。
背景情報
リアルタイムデータをターゲットデータベースに書き込む前に変換またはフィルタリングする必要がある場合、DTS のストリームベースの ETL 機能を使用できます。ETL ロジックは、ドメイン特化言語 (DSL) スクリプト言語を通じて定義されます。DSL の概要とその構文については、「データ処理 DSL 構文の概要」をご参照ください。
DTS は、2 つの方法で ETL を設定できます。
DTS の移行タスクと同期タスクはどちらも ETL 設定をサポートしています。このトピックでは、同期タスクを例として説明します。移行タスクの設定方法も同様です。
サポート対象のデータベース
次の表に、ETL でサポートされているソースデータベースとターゲットデータベースを示します。
ソースデータベース | ターゲットデータベース |
SQL Server |
|
MySQL |
|
セルフマネージド Oracle |
|
PolarDB for MySQL |
|
PolarDB for PostgreSQL (Compatible with Oracle) |
|
PolarDB-X 1.0 |
|
PolarDB-X 2.0 |
|
セルフマネージド Db2 for LUW | MySQL |
セルフマネージド Db2 for i | MySQL |
PolarDB for PostgreSQL |
|
PostgreSQL |
|
TiDB |
|
MongoDB | Lindorm |
同期タスク作成時の ETL 設定
注意事項
ETL スクリプトで新しい列を追加する場合、それらの列をターゲットデータベースに手動で追加する必要があります。そうしないと、ETL スクリプトは有効になりません。たとえば、
e_set(`new_column`, dt_now())の場合、new_columnをターゲットデータベースに手動で追加する必要があります。DSL スクリプトは、データ変換とクリーニング操作のみを処理します。データベースオブジェクトの作成はサポートしていません。
DSL スクリプトで参照されるフィールドはソースデータベースに存在し、どのフィルター条件によっても除外されていない必要があります。そうしないと、タスクが失敗する可能性があります。
DSL スクリプトでは大文字と小文字が区別されます。データベース名、テーブル名、フィールド名は、ソースデータベースのものと完全に一致させる必要があります。
DSL スクリプトは複数の式をサポートしていません。複数の式を 1 つにまとめるには、
e_compose関数を使用してください。ソースデータベースのすべてのテーブルからのすべての DML 変更は、DSL 処理後に同一の列情報を生成する必要があります。そうしないと、タスクが失敗する可能性があります。たとえば、
e_set関数を使用して列を追加する場合、ソースデータベースからの INSERT、UPDATE、DELETE 操作がすべて、ターゲットテーブルに同じ追加列を生成するようにしてください。詳細については、「データ変更時間の記録」をご参照ください。
操作手順
同期タスクを作成します。詳細については、「同期ソリューションの概要」をご参照ください。
詳細設定 ステップで、ETL 機能の設定 を ○ に設定します。
入力ボックスに、データ処理 DSL 構文 を使用して ETL 文を入力します。
説明たとえば、id が 3 より大きいレコードを破棄するには、
e_if(op_gt(`id`, 3), e_drop())を使用します。ここで、op_gtは値が別の値より大きいかどうかをチェックする式関数であり、idは変数です。このスクリプトは、id > 3 のレコードをフィルタリングします。必要に応じて残りのステップを完了します。
既存の同期タスクにおける ETL 設定の変更
既存の同期タスクで ETL 設定を変更するには、次の操作が含まれます。
ETL が設定されていない既存の同期タスクがある場合 (つまり、同期タスクを作成したときに ETL 機能の設定 が いいえ に設定されていた場合)、いいえ を ○ に変更し、DSL スクリプトを設定できます。
ETL がすでに設定されている場合は、既存の DSL スクリプトを変更するか、ETL 機能の設定 を いいえ に設定できます。
重要既存の DSL スクリプトを変更するには、まず同期オブジェクトを 選択中のオブジェクト から ソースオブジェクト に戻し、再度 選択中のオブジェクト に追加してから DSL スクリプトを編集します。
移行タスクでは DSL スクリプトの変更はサポートされていません。
注意事項
既存の同期タスクで ETL 設定を変更しても、ターゲットデータベースのテーブルスキーマの変更はサポートされません。スキーマを変更するには、同期タスクを開始する前にターゲットデータベースで変更してください。
ETL 設定を変更すると、データリンクが中断される可能性があります。慎重に進めてください。
ETL 設定の変更は、タスクの再起動後に処理される増分データにのみ適用されます。変更前に処理された既存データには影響しません。
DSL スクリプトは、データ変換とクリーニング操作のみを処理します。データベースオブジェクトの作成はサポートしていません。
DSL スクリプトで参照されるフィールドはソースデータベースに存在し、どのフィルター条件によっても除外されていない必要があります。そうしないと、タスクが失敗する可能性があります。
DSL スクリプトでは大文字と小文字が区別されます。データベース名、テーブル名、フィールド名は、ソースデータベースのものと完全に一致させる必要があります。
DSL スクリプトは複数の式をサポートしていません。複数の式を 1 つにまとめるには、
e_compose関数を使用してください。ソースデータベースのすべてのテーブルからのすべての DML 変更は、DSL 処理後に同一の列情報を生成する必要があります。そうしないと、タスクが失敗する可能性があります。たとえば、
e_set関数を使用して列を追加する場合、ソースデータベースからの INSERT、UPDATE、DELETE 操作がすべて、ターゲットテーブルに同じ追加列を生成するようにしてください。詳細については、「データ変更時間の記録」をご参照ください。
操作手順
新しい DTS 同期タスクのリストページにログインします。
対象の同期タスクで、
をクリックし、ETL 設定の変更 を選択します。詳細設定 ステップで、ETL 機能の設定 を ○ に設定します。
入力ボックスに、データ処理 DSL 構文 を使用して ETL 文を入力します。
説明たとえば、id が 3 より大きいレコードを破棄するには、
e_if(op_gt(`id`, 3), e_drop())を使用します。ここで、op_gtは値が別の値より大きいかどうかをチェックする式関数であり、idは変数です。このスクリプトは、id > 3 のレコードをフィルタリングします。必要に応じて残りのステップを完了します。
データ処理 DSL 構文の概要
データ処理 DSL は、DTS 同期シナリオで ETL ロジックを定義するためのスクリプト言語です。条件関数をサポートし、文字列、日付、数値を以下の特徴で処理します。
強力な機能:多くの関数を提供し、関数の組み合わせをサポートします。
比較的シンプルな構文:データフィルタリング、変換、マスキングなどの一般的なシナリオの例が含まれています。詳細については、「一般的なシナリオ例」をご参照ください。
高い実行効率:コード生成技術を使用して、同期プロセスへのパフォーマンスへの影響を最小限に抑えます。
DSL 構文では、列名は単一引用符 ('') ではなく、バックティック (``) を使用します。
このプロダクトは SLS データ処理構文を参照しています。JSON 関数はサポートしていますが、イベント分割関数はサポートしていません。SLS 構文については、「構文の概要」をご参照ください。
一般的なシナリオ例
データフィルタリング
数値列によるフィルタリング:id > 10000 のレコードを破棄して同期しないようにします:e_if(op_gt(`id`, 10000), e_drop())。
文字列一致によるフィルタリング:name に "hangzhou" が含まれるレコードを破棄します:e_if(str_contains(`name`, "hangzhou"), e_drop())。
日付によるフィルタリング:order_timestamp が特定の日時より前のレコードを同期しません:e_if(op_lt(`order_timestamp`, "2015-02-23 23:54:55"), e_drop())。
複数条件によるフィルタリング:
id > 1000 かつ name に "hangzhou" が含まれるレコードを破棄します:e_if(op_and(str_contains(`name`, "hangzhou"), op_gt(`id`, 1000)), e_drop())。
id > 1000 または name に "hangzhou" が含まれるレコードを破棄します:e_if(op_or(str_contains(`name`, "hangzhou"), op_gt(`id`, 1000)), e_drop())。
データマスキング
マスキング:phone 列の最後の 4 桁をアスタリスクに置き換えます:e_set(`phone`, str_mask(`phone`, 7, 10, '*'))。
データ変更時間の記録
すべてのテーブルに列を追加:__OPERATION__ が INSERT、UPDATE、または DELETE の場合、"dts_sync_time" という名前の列を追加し、その値にログのコミットタイムスタンプ (__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__))特定のテーブル "dts_test_table" に列を追加:__OPERATION__ が INSERT、UPDATE、または DELETE の場合、"dts_sync_time" という名前の列を追加し、その値にログのコミットタイムスタンプ (__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__))説明タスクを開始する前に、ターゲットテーブルに "dts_sync_time" 列を手動で追加する必要があります。
データ変更監査
データ変更の種類と時間を記録:変更の種類を "operation_type" 列に、変更タイムスタンプを "updated" 列にターゲットデータベースに書き込みます。
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__)
)タスクを開始する前に、ターゲットテーブルに "operation_type" と "updated" 列を追加する必要があります。
完全データと増分データの区別
データが完全移行または増分移行のどちらから来たかを is_increment_dml 列に記録します。__COMMIT_TIMESTAMP__ の値を確認することで、完全移行と増分移行を区別できます。完全移行では、__COMMIT_TIMESTAMP__ は 0 (1970-01-01 08:00:00、タイムゾーンの影響を受けます) です。増分移行では、ソースデータベースのログ書き込み時間を反映します。対応する ETL スクリプトは次のとおりです。
e_if_else(__COMMIT_TIMESTAMP__ > DATETIME('2000-01-01 00:00:00'),
e_set(`is_increment_dml`, True),
e_set(`is_increment_dml`, False)
)データ処理 DSL 構文
定数と変数
定数
型
例
int
123
float
123.4
string
"hello1_world"
boolean
true または false
datetime
DATETIME('2021-01-01 10:10:01')
変数
変数
説明
データの型
値の例
__TB__
テーブル名
string
table
__DB__
データベース名
string
mydb
__OPERATION__
操作タイプ
string
__OP_INSERT__, __OP_UPDATE__, __OP_DELETE__
__BEFORE__
UPDATE 操作の変更前の値
説明DELETE 操作には変更前の値のみがあります。
特殊マーカー、型なし
v(`column_name`,__BEFORE__)
__AFTER__
UPDATE 操作の変更後の値
説明INSERT 操作には変更後の値のみがあります。
特殊マーカー、型なし
v(`column_name`,__AFTER__)
__COMMIT_TIMESTAMP__
トランザクションのコミット時間
datetime
'2021-01-01 10:10:01'
`column`
レコードの指定された列の値
string
`id`, `name`
式関数
数値演算
関数
構文
有効値
戻り値
例
加算
op_sum(value1, value2)
value1:整数または浮動小数点数
value2:整数または浮動小数点数
両方のパラメーターが整数の場合は整数を返します。それ以外の場合は浮動小数点数を返します。
op_sum(`col1`, 1.0)
減算
op_sub(value1, value2)
value1:整数または浮動小数点数
value2:整数または浮動小数点数
両方のパラメーターが整数の場合は整数を返します。それ以外の場合は浮動小数点数を返します。
op_sub(`col1`, 1.0)
乗算
op_mul(value1, value2)
value1:整数または浮動小数点数
value2:整数または浮動小数点数
両方のパラメーターが整数の場合は整数を返します。それ以外の場合は浮動小数点数を返します。
op_mul(`col1`, 1.0)
除算
op_div_true(value1, value2)
value1:整数または浮動小数点数
value2:整数または浮動小数点数
両方のパラメーターが整数の場合は整数を返します。それ以外の場合は浮動小数点数を返します。
op_div_true(`col1`, 2.0); col1=15 の場合、7.5 を返します。
剰余演算
op_mod(value1, value2)
value1:整数または浮動小数点数
value2:整数または浮動小数点数
両方のパラメーターが整数の場合は整数を返します。それ以外の場合は浮動小数点数を返します。
op_mod(`col1`, 10); col1=23 の場合、3 を返します。
論理演算
関数
構文
有効値
戻り値
例
等価チェック
op_eq(value1, value2)
value1:整数、浮動小数点数、または文字列
value2:整数、浮動小数点数、または文字列
ブール値:true または false
op_eq(`col1`, 23)
より大きいかどうかのチェック
op_gt(value1, value2)
value1:整数、浮動小数点数、または文字列
value2:整数、浮動小数点数、または文字列
ブール値:true または false
op_gt(`col1`, 1.0)
より小さい
op_lt(value1, value2)
value1:整数、浮動小数点数、または文字列
value2:整数、浮動小数点数、または文字列
ブール値:true または false
op_lt(`col1`, 1.0)
以上かどうかのチェック
op_ge(value1, value2)
value1:整数、浮動小数点数、または文字列
value2:整数、浮動小数点数、または文字列
ブール値:true または false
op_ge(`col1`, 1.0)
以下かどうかのチェック
op_le(value1, value2)
value1:整数、浮動小数点数、または文字列
value2:整数、浮動小数点数、または文字列
ブール値:true または false
op_le(`col1`, 1.0)
AND 演算
op_and(value1, value2)
value1:ブール値
value2:ブール値
ブール値:true または false
op_and(`is_male`, `is_student`)
OR 演算
op_or(value1, value2)
value1:ブール値
value2:ブール値
ブール値:true または false
op_or(`is_male`, `is_student`)
IN 演算
op_in(value, json_array)
value:任意の型
json_array:JSON 形式の文字列
ブール値:true または false
op_in(`id`,json_array('["0","1","2","3","4","5","6","7","8"]'))
値が null かどうかのチェック
op_is_null(value)
value:任意の型
ブール値:true または false
op_is_null(`name`)
値が null でないかのチェック
op_is_not_null(value)
value:任意の型
ブール値:true または false
op_is_not_null(`name`)
文字列関数
関数
構文
値の範囲
戻り値
例
文字列の連結
op_add(str_1,str_2,...,str_n)
str_1:文字列
str_2:文字列
...
str_n:文字列
連結された文字列
op_add(`col`,'hangzhou','dts')
文字列のフォーマットと連結
str_format(format, value1, value2, value3, ...)
format:波括弧をプレースホルダーとして使用する文字列 (例: "part1: {}, part2: {}")
value1:任意の型
value2:任意の型
フォーマットされた文字列
str_format("part1: {}, part2: {}", `col1`, `col2`); col1="ab" かつ col2="12" の場合、"part1: ab, part2: 12" を返します。
文字列の置換
str_replace(original, oldStr, newStr, count)
original:元の文字列
oldStr:置換する文字列
newStr:置換後の文字列
count:整数、最大置換回数。すべての出現箇所を置換する場合は -1 を設定します。
置換された文字列
str_replace(`name`, "a", 'b', 1); name="aba" の場合、"bba" を返します。str_replace(`name`, "a", 'b', -1); name="aba" の場合、"bbb" を返します。
すべての文字列型フィールド (varchar、text、char など) の値を置換
tail_replace_string_field(search, replace, all)
search:置換する文字列
replace:置換後の文字列
all:すべての一致を置換するかどうか。現在、true のみをサポートしています。
説明すべての一致を置換したくない場合は、
str_replace関数を使用してください。
置換された文字列
tail_replace_string_field('\u000f', '', true) は、文字列型フィールド値の "\u000f" のすべての出現箇所をスペースに置き換えます。
文字列の先頭と末尾から指定された文字を削除
str_strip(string_val, charSet)
string_val:元の文字列
char_set:削除する文字のセット
先頭と末尾の文字が削除された文字列
str_strip(`name`, 'ab'); name=axbzb の場合、xbz を返します。
文字列を小文字に変換
str_lower(value)
value:文字列の列または文字列リテラル
小文字の文字列
str_lower(`str_col`)
文字列を大文字に変換
str_upper(value)
value:文字列の列または文字列リテラル
大文字の文字列
str_upper(`str_col`)
文字列を数値に変換
cast_string_to_long(value)
value:文字列
整数
cast_string_to_long(`col`)
数値を文字列に変換
cast_long_to_string(value)
value:整数
文字列
cast_long_to_string(`col`)
部分文字列の出現回数をカウント
str_count(str,pattern)
str:文字列の列または文字列リテラル
pattern:検索する部分文字列
部分文字列の出現回数
str_count(`str_col`, 'abc'); str_col="zabcyabcz" の場合、2 を返します。
部分文字列の位置を検索
str_find(str, pattern)
str:文字列の列または文字列リテラル
pattern:検索する部分文字列
最初の一致の位置。見つからない場合は `-1` を返します
str_find(`str_col`, 'abc'); `str_col="xabcy"` の場合、`1` を返します。
文字列が文字のみで構成されているかチェック
str_isalpha(str)
str:文字列の列または文字列リテラル
true または false
str_isalpha(`str_col`)
文字列が数字のみで構成されているかチェック
str_isdigit(str)
str:文字列の列または文字列リテラル
true または false
str_isdigit(`str_col`)
正規表現マッチング
regex_match(str,regex)
str:文字列の列または文字列リテラル
regex:正規表現の文字列の列または文字列リテラル
true または false
regex_match(__TB__,'user_\\d+')
データマスキングのために文字列の一部を指定された文字でマスクします。たとえば、電話番号の最後の 4 桁をアスタリスクに置き換えます
str_mask(str, start, end, maskStr)
str:文字列の列または文字列リテラル
start:整数、マスキングの開始位置 (最小値 0)
end:整数、マスキングの終了位置 (最大値は文字列の長さマイナス 1)
maskStr:単一文字の文字列 (例: '#')
開始位置から終了位置までの文字がマスクされた文字列
str_mask(`phone`, 7, 10, '#')
cond の後の文字列の一部を抽出
substring_after(str, cond)
str:元の文字列
cond:文字列
文字列
説明結果には cond は含まれません。
substring_after(`col`, 'abc')
cond の前の文字列の一部を抽出
substring_before(str, cond)
str:元の文字列
cond:文字列
文字列
説明結果には cond は含まれません。
substring_before(`col`, 'efg')
cond1 と cond2 の間の文字列の一部を抽出
substring_between(str, cond1, cond2)
str:元の文字列
cond1:文字列
cond2:文字列
文字列
説明結果には cond1 や cond2 は含まれません。
substring_between(`col`, 'abc','efg')
値が文字列型かどうかのチェック
is_string_value(value)
value:文字列または列名
ブール値:true または false
is_string_value(`col1`)
文字列型フィールドの内容を置換。末尾から逆順に開始します
tail_replace_string_field(search, replace, all)
search:置換する文字列
replace:置換後の文字列
all:すべてを置換するかどうか。true または false
置換された文字列
すべての文字列フィールド値の "\u000f" をスペースに置き換えます。
tail_replace_string_field('\u000f','',true)
MongoDB のフィールドの値を取得
bson_value("field1","field2","field3",...)
field1:トップレベルのフィールド名
field2:第 2 レベルのフィールド名
ドキュメント内の指定されたフィールドの値
e_set(`user_id`, bson_value("id"))
e_set(`user_name`, bson_value("person","name"))
日時関数
関数
構文
値の範囲
戻り値
例
現在のシステム時間
dt_now()
なし
DATETIME、秒単位の精度
dts_now()
dt_now_millis()
なし
DATETIME、ミリ秒単位の精度
dt_now_millis()
協定世界時 (UTC) タイムスタンプ (秒) を DATETIME に変換
dt_fromtimestamp(value,[timezone])
value:整数
timezone:タイムゾーン (オプション)
DATETIME、秒単位の精度
dt_fromtimestamp(1626837629)
dt_fromtimestamp(1626837629,'GMT+08')
協定世界時 (UTC) タイムスタンプ (ミリ秒) を DATETIME に変換
dt_fromtimestamp_millis(value,[timezone])
value:整数
timezone:タイムゾーン (オプション)
DATETIME、ミリ秒単位の精度
dt_fromtimestamp_millis(1626837629123);
dt_fromtimestamp_millis(1626837629123,'GMT+08')
DATETIME を協定世界時 (UTC) タイムスタンプ (秒) に変換
dt_parsetimestamp(value,[timezone])
value:DATETIME
timezone:タイムゾーン (オプション)
整数
dt_parsetimestamp(`datetime_col`)
dt_parsetimestamp(`datetime_col`,'GMT+08')
DATETIME を協定世界時 (UTC) タイムスタンプ (ミリ秒) に変換
dt_parsetimestamp_millis(value,[timezone])
value:DATETIME
timezone:タイムゾーン (オプション)
整数
dt_parsetimestamp_millis(`datetime_col`)
dt_parsetimestamp_millis(`datetime_col`,'GMT+08')
DATETIME を文字列に変換
dt_str(value, format)
value:DATETIME
format:yyyy-MM-dd HH:mm:ss 形式の文字列
文字列
dt_str(`col1`, 'yyyy-MM-dd HH:mm:ss')
文字列を DATETIME に変換
dt_strptime(value,format)
value:文字列
format:yyyy-MM-dd HH:mm:ss 形式の文字列
DATETIME
dt_strptime('2021-07-21 03:20:29', 'yyyy-MM-dd hh:mm:ss')
年、月、日、時、分、秒を加算または減算して時間を調整
dt_add(value, [years=intVal],
[months=intVal],
[days=intVal],
[hours=intVal],
[minutes=intVal]
)
value:DATETIME
intVal:整数
説明マイナス記号 (−) は減算を示します。
DATETIME
dt_add(datetime_col,years=-1)
dt_add(datetime_col,years=1,months=1)
条件式
関数
構文
値の範囲
戻り値
例
C 言語の三項演算子 (
? :) に似ており、条件に基づいて値を返します(cond ? val_1 : val_2)
cond:ブール値のフィールドまたは式
val_1:戻り値 1
val_2:戻り値 2
説明val_1 と val_2 は同じ型でなければなりません。
cond が true の場合は val_1 を返し、それ以外の場合は val_2 を返します
(id>1000? 1 : 0)
JSON 関数
説明値の型は、データベース内の任意のフィールド型を表します。
関数
構文
有効値
戻り値
例
JSON 配列文字列をセットに変換
json_array(arrayText)
説明ブール値を返す式でのみ使用できます。
arrayText:文字列、変換する JSON 配列文字列
セット
op_in(`id`,json_array('["0","1","2","3"]'))はセット["0","1","2","3"]を返します。指定されたデータで JSON 配列を作成
json_array2(item...)
item...:値の型、JSON 配列のデータ
JSON 配列
json_array2("0","1","2","3")は["0","1","2","3"]を返します。指定されたデータで JSON オブジェクトを作成
json_object(item...)
item...:JSON オブジェクトのデータ (キーと値のペア)。キー名 (文字列) とキー値 (値の型) で構成され、カンマ (,) で区切られます。
JSON
json_object('name','ZhangSan','age',32, 'loginId',100)は{"name":"ZhangSan","age":32,"loginId":100}を返します。JSON オブジェクトの指定された位置 (配列) にデータを挿入
json_array_insert(json, kvPairs...)
json:文字列、変更する JSON オブジェクト
kvPairs...:挿入するデータ。各ペアは JSONPath (文字列) と値 (値の型) で構成され、カンマで区切られます。
JSON
説明指定された位置が存在しない場合、元の JSON オブジェクトを返します。
指定された位置の要素が存在しない場合、データはターゲット配列の末尾に追加されます。
json_array_insert('{"Address":["City",1]}','$.Address[3]',100)は{"Address":["City",1,100]}を返します。JSON オブジェクトの指定された位置にデータを挿入
json_insert(json, kvPairs...)
json:文字列、変更する JSON オブジェクト
kvPairs...:挿入するデータ。各ペアは JSONPath (文字列) と値 (値の型) で構成され、カンマで区切られます。
JSON
説明指定された場所が存在する場合、システムは操作対象の JSON オブジェクトを返します。
指定された位置が存在しない場合、データは JSON オブジェクトに追加されます。
json_insert('{"Address":["City","Xian","Number",1]}','$.ID',100)は{"Address":["City","Xian","Number",1],"ID":100}を返します。JSON オブジェクトの指定された位置にデータを挿入または更新
json_set(json, kvPairs...)
json:文字列、変更する JSON オブジェクト
kvPairs...:挿入または更新するデータ。各ペアは JSONPath (文字列) と値 (値の型) で構成され、カンマで区切られます。
値の型
説明指定された位置が存在する場合、データを更新します。
指定された位置が存在しない場合、データを JSON オブジェクトに追加します。
json_set('{"ID":1,"Address":["City","Xian","Number",1]}',"$.IP",100)は{"ID":1,"Address":["City","Xian","Number",1], "IP":100}を返します。JSON オブジェクトにキーと値のペアを挿入または更新
json_put(json, key, value)
json:文字列、変更する JSON オブジェクト
key:文字列、挿入または更新するキー名
value:値の型、キーの値
JSON
説明json が JSON オブジェクトでない場合、null を返します。
キーが存在する場合、その値を更新します。
キーが存在しない場合、JSON オブジェクトに追加します。
json_put('{"loginId":100}','loginTime','2024-10-10')は{"loginId":100, "loginTime":"2024-10-10"}を返します。JSON オブジェクトの指定された位置のデータを置換
json_replace(json, kvPairs...)
json:文字列、変更する JSON オブジェクト
kvPairs...:置換するデータ。各ペアは JSONPath (文字列) と値 (値の型) で構成され、カンマで区切られます。
値の型
説明指定された位置が存在しない場合、元の JSON オブジェクトを返します。
json_replace('{"ID":1,"Address":["City","Xian","Number",1]}',"$.IP",100)は{"ID":1,"Address":["City","Xian","Number",1]}を返します。JSON オブジェクトの位置に指定されたデータが存在するかチェック
json_contains(json, jsonPath, item)
json:文字列、クエリする JSON オブジェクト
jsonPath:文字列、JSON オブジェクト内の位置
item:値の型、検索するデータ
ブール値:true または false
json_contains('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID',1)はtrueを返します。JSON オブジェクトに指定された位置が存在するかどうかをチェックします。
json_contains_path(json, jsonPath)
json:文字列、クエリする JSON オブジェクト
jsonPath:文字列、チェックする位置
ブール値:true または false
json_contains_path('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID')はtrueを返します。JSON オブジェクトの指定された位置からデータを取得
json_extract(json, jsonPath)
json:文字列、クエリする JSON オブジェクト
jsonPath:文字列、JSON オブジェクト内の位置
値の型
json_extract('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID')は1を返します。JSON オブジェクトの指定されたキーの値を取得
json_get(json, key)
json:文字列、クエリする JSON オブジェクト
key:文字列、キー名
値の型
json_get('{"ID":1,"Address":["City","Xian","Number",1]}','ID')は1を返します。JSON オブジェクトの指定された位置のすべてのキーを取得
json_keys(json, jsonPath)
json:文字列、クエリする JSON オブジェクト
jsonPath:文字列、JSON オブジェクト内の位置
JSON 配列
json_keys('{"ID":1,"Address":["City","Xian","Number",1]}','$')は["ID","Address"]を返します。JSON オブジェクトの指定された位置の長さ (キーの数) を取得
json_length(json, jsonPath)
json:文字列、クエリする JSON オブジェクト
jsonPath:文字列、JSON オブジェクト内の位置
説明jsonPath が
"$"の場合、json_length(json)と同等です。
整数
json_length('{"ID":1,"Address":["City","Xian","Number",1]}','$')は2を返します。JSON オブジェクトのルートの長さ (キーの数) を取得
json_length(json)
json:文字列、クエリする JSON オブジェクト
整数
json_length('{"ID":1,"Address":["City","Xian","Number",1]}')は2を返します。JSON 文字列を JSON オブジェクトに解析
json_parse(json)
json:文字列、解析する JSON 文字列
値の型
json_parse('{"ID":1,"Address":["City","Xian","Number",1]}')は{"ID":1,"Address":["City","Xian","Number",1]}を返します。JSON オブジェクトの指定された位置からデータを削除
json_remove(json, jsonPath)
json:文字列、変更する JSON オブジェクト
jsonPath:文字列、JSON オブジェクト内の位置
JSON
json_remove('{"loginId":100, "loginTime":"2024-10-10"}','$.loginTime')は{"loginId":100}を返します。
グローバル関数
フロー制御関数
関数
構文
パラメーター
例
if 文
e_if(bool_expr, func_invoke)
bool_expr:ブール値の定数または関数呼び出し。定数:true または false。関数呼び出しの例:op_gt(`id`, 10)。
func_invoke:関数呼び出し。サポート対象:e_drop, e_keep, e_set, e_if, e_compose
e_if(op_gt(`id`, 10), e_drop()); ID > 10 の場合、レコードを破棄します。
if-else 文
e_if_else(bool_expr, func_invoke1, func_invoke2)
bool_expr:ブール値の定数または関数呼び出し。定数:true または false。関数呼び出しの例:op_gt(`id`, 10)。
func_invoke1:条件が true の場合に実行される関数呼び出し。
func_invoke2:条件が false の場合に実行される関数呼び出し。
e_if_else(op_gt(`id`, 10), e_set(`tag`, 'large'), e_set(`tag`, 'small')); ID > 10 の場合、tag を "large" に設定し、それ以外の場合は "small" に設定します。
複数の条件を評価し、最初に一致した操作を実行する switch のような文。どの条件にも一致しない場合は、デフォルトの操作を実行します。
s_switch(condition1, func1, condition2, func2, ..., default=default_func)
condition1:ブール値の定数または関数呼び出し。定数:true または false。関数呼び出しの例:op_gt(`id`, 10)。
func_invoke:関数呼び出し。condition1 をチェックし、true の場合はこの関数を実行して switch を終了します。false の場合は次の条件をチェックします。
default_func:すべての条件が false の場合に実行される関数呼び出し。
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'))。
複数の操作を組み合わせる
e_compose(func1, func2, func3, ...)
func1:関数呼び出し。e_set, e_drop, e_if が可能です。
func2:関数呼び出し。e_set, e_drop, e_if が可能です。
e_compose(e_set(`str_col`, 'test'), e_set(`dt_col`, dt_now())); str_col を "test" に、dt_col を現在の時刻に設定します。
データ操作関数
関数
構文
パラメーター
例
このレコードを破棄する (同期しない)
e_drop()
なし
e_if(op_gt(`id`, 10), e_drop()); ID > 10 のレコードを破棄します。
このレコードを保持する (ターゲットに同期する)
e_keep(condition)
condition:ブール式
e_keep(op_gt(id, 1)); ID > 1 のレコードのみを同期します。
列の値を設定
e_set(`col`, val, NEW)
col:列名
val:定数または関数呼び出し。col のデータ型と一致する必要があります。
NEW:col を val のデータ型に変換します (オプション)
重要NEW を省略する場合は、前のカンマを含めないでください。タスクエラーを避けるために、データ型の互換性を確認してください。
e_set(`dt_col`, dt_now()); dt_col を現在の時刻に設定します。
e_set(`col1`, `col2` + 1); col1 を col2 + 1 に設定します。
e_set(`col1`, 1, NEW); col1 を数値型に変換し、1 に設定します。
MongoDB のフィールド保持、フィールド破棄、およびフィールド名マッピング
e_expand_bson_value('*', 'fieldA',{"fieldB":"fieldC"})
*:保持するフィールド名。* はすべてのフィールドを意味します。
fieldA:破棄するフィールド名。
{"fieldB":"fieldC"}:フィールド名マッピング。fieldB はソースフィールド名、fieldC はターゲットフィールド名です。
説明フィールド名マッピングはオプションです。
e_expand_bson_value("*", "_id,name"); _id と name を除くすべてのフィールドをターゲットに書き込みます。