Data Transmission Service (DTS) は、ストリーミングデータの抽出、変換、書き出し (ETL) 機能を提供します。この機能は、DTS の効率的なデータレプリケーション機能と組み合わせることで、ストリーミングデータの抽出、変換、処理、書き出しを可能にします。このトピックでは、DTS タスクの ETL を構成する方法について説明し、関連する構文情報を提供します。ETL 機能は、データフィルタリング、データマスキング、データ変更時刻の記録、データ変更の監査などのシナリオで使用できます。
背景情報
DTS は、データの再配置やリアルタイムのデータ転送に通常使用されるデータ移行および同期サービスです。ただし、データベースに書き込む前にリアルタイムデータを変換またはフィルタリングするなど、データを処理する必要がある場合があります。これらのニーズを満たすために、DTS はストリーミングデータ ETL 機能を提供します。この機能は、ドメイン固有言語 (DSL) スクリプト言語をサポートし、データ処理ロジックを柔軟に定義します。DSL の概要とその構成構文については、「データ処理 DSL 構文の概要」をご参照ください。
DTS は、ETL を構成するための 2 つのメソッドをサポートしています。
DTS の移行タスクと同期タスクの両方で ETL を構成できます。このトピックでは、同期タスクを例として使用します。移行タスクの構成方法も同様です。
サポートされているデータベース
次の表に、ETL をサポートするソースデータベースとターゲットデータベースを示します。
ソースデータベース | ターゲットデータベース |
SQL Server |
|
MySQL |
|
セルフマネージド Oracle |
|
PolarDB for MySQL |
|
PolarDB for PostgreSQL (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 スクリプトは複数の式をサポートしていません。
e_compose関数を使用して、複数の式を 1 つの式にまとめることができます。DSL スクリプトによって処理された後、ソースデータベース内のすべてのテーブルに対する DML の変更は、同じ列情報を持つ必要があります。そうしないと、タスクが失敗する可能性があります。たとえば、DSL スクリプトで
e_set関数を使用して新しい列を追加する場合、ソースデータベースの INSERT、UPDATE、および DELETE 操作のすべてが、ターゲットテーブルに新しい列が追加される結果になるようにする必要があります。詳細については、「データ変更時刻の記録」をご参照ください。
手順
同期タスクを作成します。詳細については、「同期ソリューション」をご参照ください。
詳細設定 ステップで、ETL の設定 を ○ に設定します。
テキストボックスに、データ処理 DSL 構文に基づいてデータ変換 (ETL) 文を入力します。
説明たとえば、DSL を使用して 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 スクリプトは変更できません。
注意
既存の同期タスクの ETL 構成を変更しても、ターゲットテーブルのテーブルスキーマの変更はサポートされません。スキーマを変更するには、同期タスクを開始する前にターゲットデータベースでテーブルスキーマを変更する必要があります。
ETL 構成を変更すると、タスクが中断される可能性があります。注意して進めてください。
ETL 構成への変更は、同期タスクが開始された後の増分データにのみ有効になります。これらの変更は、変更前に同期された既存データには影響しません。
DSL スクリプトは、主にデータ変換とクレンジングに使用されます。データベースオブジェクトの作成はサポートしていません。
DSL スクリプトで構成されたフィールドは、ソースデータベースに存在する必要があり、フィルター条件によって除外されたフィールドであってはなりません。そうしないと、タスクが失敗する可能性があります。
DSL スクリプトでは大文字と小文字が区別されます。データベース、テーブル、およびフィールド名は、ソースデータベースの名前と完全に一致する必要があります。
DSL スクリプトは複数の式をサポートしていません。
e_compose関数を使用して、複数の式を 1 つの式にまとめることができます。DSL スクリプトによって処理された後、ソースデータベース内のすべてのテーブルに対する DML の変更は、同じ列情報を持つ必要があります。そうしないと、タスクが失敗する可能性があります。たとえば、DSL スクリプトで
e_set関数を使用して新しい列を追加する場合、ソースデータベースの INSERT、UPDATE、および DELETE 操作のすべてが、ターゲットテーブルに新しい列が追加される結果になるようにする必要があります。詳細については、「データ変更時刻の記録」をご参照ください。
手順
新しい DTS コンソールのデータ同期タスクページにログインします。
ターゲットの同期タスクの行で、
アイコンをクリックし、[ETL 構成の変更] を選択します。詳細設定 ステップで、ETL の設定 を ○ に設定します。
テキストボックスに、データ処理 DSL 構文に基づいてデータ変換 (ETL) 文を入力します。
説明たとえば、DSL を使用して ID が 3 より大きいレコードを処理するには、
e_if(op_gt(`id`, 3), e_drop())を使用できます。このスクリプトでは、op_gtは値が別の値より大きいかどうかをチェックする条件関数であり、idは変数です。このスクリプトは、ID が 3 より大きいレコードを除外します。必要に応じて後続のステップを完了します。
データ処理 DSL 構文の概要
データ処理 DSL は、データ同期シナリオでのデータ処理のために DTS によって設計されたスクリプト言語です。条件関数をサポートし、文字列、日付、数値を処理できます。データ処理ロジックを柔軟に定義でき、次の属性があります。
強力: 多くの関数を提供し、関数の構成をサポートします。
比較的単純な構文: データフィルタリング、データ変換、データマスキングなどの一般的なシナリオの例を提供します。詳細については、「一般的なシナリオの例」をご参照ください。
高性能: コード生成技術に基づいており、同期プロセスへのパフォーマンスへの影響は最小限です。
DSL 構文では、列名は単一引用符 (') ではなく、バックティック (``) で囲みます。
この機能は、Simple Log Service (SLS) のデータ処理構文に基づいています。JSON 関数をサポートしますが、イベント分割関数はサポートしません。SLS 構文の詳細については、「構文の概要」をご参照ください。
一般的なシナリオの例
データフィルタリング
数値列でフィルタリング: `id` > 10000 の場合、レコードを破棄し、ターゲットデータベースに同期しません: e_if(op_gt(`id`, 10000), e_drop())。
文字列一致条件でフィルタリング: `name` 列に "hangzhou" が含まれている場合、レコードを破棄します: e_if(str_contains(`name`, "hangzhou"), e_drop())。
日付でフィルタリング: 注文時刻が特定の時刻より前の場合、レコードを同期しません: e_if(op_lt(`order_timestamp`, "2015-02-23 23:54:55"), e_drop())。
複数の条件でフィルタリング:
`id` > 1000 AND `name` 列に "hangzhou" が含まれている場合、レコードを破棄します: e_if(op_and(str_contains(`name`, "hangzhou"), op_gt(`id`, 1000)), e_drop())。
`id` > 1000 OR `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 操作の before イメージ (更新前の値)
説明DELETE 操作には before イメージしかありません。
特殊なマーク、型なし
v(`column_name`,__BEFORE__)
__AFTER__
UPDATE 操作の after イメージ (更新後の値)
説明INSERT 操作には after イメージしかありません。
特殊なマーク、型なし
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"]'))
Is null
op_is_null(value)
value: 任意の型
ブール値: true または false
op_is_null(`name`)
Is not 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: 長さ 1 の文字列。例: '#'。
開始位置から終了位置までの部分以降の文字列がマスクされます
str_mask(`phone`, 7, 10, '#')
指定された文字列の後の部分文字列を取得します
substring_after(str, cond)
str: 元の文字列
cond: 文字列
文字列
説明戻り値には文字列 cond は含まれません。
substring_after(`col`, 'abc')
指定された文字列の前の部分文字列を取得します
substring_before(str, cond)
str: 元の文字列
cond: 文字列
文字列
説明戻り値には文字列 cond は含まれません。
substring_before(`col`, 'efg')
2 つの指定された文字列の間の部分文字列を取得します
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: レベル 1 フィールドの名前。
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 関数
説明`value` 型は、データベース内の任意のフィールドの型を表します。
機能
構文
有効値
戻り値
例
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 配列のデータ。データ型は value です。
JSON 配列
json_array2("0","1","2","3")。["0","1","2","3"]が返されます。指定されたデータを含む JSON オブジェクトを作成します
json_object(item...)
item...: JSON オブジェクトのデータ (キーと値のペア)。キー名 (文字列) とキー値 (value 型) で構成され、コンマ (,) で区切られます。
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、文字列型) と特定のデータ (value 型) で構成され、コンマ (,) で区切られます。
JSON
説明指定された位置が存在しない場合、元の JSON オブジェクトが返されます。
指定された位置の要素が存在しない場合、データはターゲット配列の末尾に追加されます。
json_array_insert('{"Address":["City",1]}','$.Address[3]',100)。{"Address":["City",1,100]}が返されます。JSON オブジェクトの指定された位置にデータを挿入します
json_insert(json, kvPairs...)
json: 処理する JSON オブジェクトを指定する文字列。
kvPairs...: 挿入するデータ。位置 (jsonPath、文字列型) と特定のデータ (value 型) で構成され、コンマ (,) で区切られます。
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、文字列型) と特定のデータ (value 型) で構成され、コンマ (,) で区切られます。
value 型
説明指定された位置が存在する場合、その位置のデータが更新されます。
指定された位置が存在しない場合、データは 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: 挿入するキー値。データ型は 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、文字列型) と特定のデータ (value 型) で構成され、コンマ (,) で区切られます。
value 型
説明指定された位置が存在しない場合、元の 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: クエリする特定のデータ。データ型は value です。
ブール値: 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 オブジェクト内の位置を指定する文字列。
value 型
json_extract('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID')。1が返されます。JSON オブジェクト内の指定されたキーの値を取得します
json_get(json, key)
json: 処理する JSON オブジェクトを指定する文字列。
key: 取得するデータのキー名を指定する文字列。
value 型
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 オブジェクトを指定する文字列。
value 型
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 文が終了します。condition1 が 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 フィールドを除くすべてのフィールドをターゲットに書き込みます。