Data Transmission Service (DTS) は、ストリームベースの抽出・変換・書き出し (ETL) データ処理機能を提供します。DTS の効率的なストリームデータレプリケーションと組み合わせることで、この機能はストリーミングデータのリアルタイムな抽出、変換、操作、書き出しを可能にします。このトピックでは、DTS リンク内で ETL を設定する方法について説明し、データフィルタリング、データマスキング、データ変更タイムスタンプの記録、データ変更の監査などのシナリオで ETL を使用するのに役立つ関連構文情報を提供します。
背景情報
DTS は、データの再配置やリアルタイムのデータ転送に一般的に使用されるデータ移行および同期サービスです。ユーザーは、ターゲットデータベースに書き込む前にリアルタイムデータを変換またはフィルタリングする必要がある場合があります。このニーズに応えるため、DTS はドメイン特化言語 (DSL) スクリプト言語を使用したストリームベースの ETL データ処理を提供し、データ処理ロジックを柔軟に定義できます。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 が特別に設計したスクリプト言語です。条件関数をサポートし、文字列、日付、数値を処理できるため、以下の特徴を持つデータ処理ロジックを柔軟に定義できます。
-
強力な機能:多くの関数を提供し、関数の組み合わせをサポートします。
-
比較的シンプルな構文:データフィルタリング、変換、マスキングなどの一般的なシナリオの例が含まれています。詳細については、「一般的なシナリオ例」をご参照ください。
-
高い実行効率:コード生成技術を使用して、同期プロセスへのパフォーマンスへの影響を最小限に抑えます。
-
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())。
-
データマスキング
マスキング:電話番号列の最後の 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 操作の変更前の値 (pre-image)
説明DELETE 操作には変更前の値のみがあります。
特殊マーカー、型なし
v(`column_name`,__BEFORE__)
__AFTER__
UPDATE 操作の変更後の値 (post-image)
説明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 の場合、タグを "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 を除くすべてのフィールドを送信先に書き込みます。
-