Saat mereplikasi data dengan Data Transmission Service (DTS), data sumber sering kali memerlukan transformasi sebelum mencapai tujuan—misalnya menyaring baris yang tidak relevan, menyembunyikan nilai sensitif, atau memperkaya setiap catatan dengan metadata seperti waktu perubahan. DTS menyediakan fitur extract, transform, and load (ETL) streaming yang menjalankan logika pemrosesan ini secara langsung antara mesin replikasi dan database tujuan. Logika ETL dinyatakan dalam bahasa domain-spesifik (DSL) yang dirancang khusus untuk skenario sinkronisasi data.
Kasus penggunaan umum:
Penyaringan data: Buang catatan yang tidak memenuhi kriteria sinkronisasi, seperti catatan dengan ID di atas ambang batas tertentu atau pesanan yang lebih lama dari tanggal batas.
Penyamaran data: Sembunyikan nilai sensitif, misalnya mengganti empat digit terakhir nomor telepon dengan tanda bintang.
Pelacakan perubahan: Tambahkan stempel waktu commit pada setiap baris yang disinkronkan agar tabel tujuan mencatat kapan data berubah.
Pencatatan audit: Tulis jenis operasi (INSERT, UPDATE, DELETE) dan waktu perubahan ke kolom khusus untuk kepatuhan atau debugging.
Cara kerja ETL
ETL dijalankan sebagai langkah pemrosesan antara mesin replikasi DTS dan database tujuan. Setiap catatan data masuk melewati skrip DSL Anda, yang dapat membuang catatan tersebut, mengubah nilai kolom, atau menambahkan kolom baru sebelum catatan ditulis ke tujuan.
DSL ini didasarkan pada sintaks pemrosesan data Simple Log Service (SLS). DSL mendukung logika kondisional, manipulasi string, operasi tanggal/waktu, aritmetika numerik, dan pemrosesan JSON. DSL tidak mendukung fungsi pemisahan event. DSL memiliki atribut-atribut berikut:
Kuat: Menyediakan banyak fungsi dan mendukung komposisi fungsi.
Sintaks relatif sederhana: Menyediakan contoh untuk skenario umum, seperti penyaringan data, transformasi data, dan penyamaran data.
Kinerja tinggi: Berbasis teknologi generasi kode, sehingga berdampak minimal terhadap proses sinkronisasi.
Nama kolom dalam skrip DSL diapit dengan backtick (``), bukan tanda kutip tunggal (').
Database yang didukung
ETL tersedia untuk kombinasi database sumber dan tujuan berikut.
| Database sumber | Database tujuan |
|---|---|
| SQL Server | AnalyticDB for MySQL 3.0, SQL Server, MySQL, PolarDB for MySQL |
| MySQL | AnalyticDB for MySQL 3.0, AnalyticDB for PostgreSQL, Kafka, ApsaraDB for ClickHouse cluster, MySQL, PolarDB for MySQL, Elasticsearch, Redis |
| Self-managed Oracle | AnalyticDB for MySQL 3.0, AnalyticDB for PostgreSQL, Kafka, MaxCompute, PolarDB-X 2.0, PolarDB for PostgreSQL (Compatible with Oracle) |
| PolarDB for MySQL |
|
| PolarDB for PostgreSQL (Compatible with Oracle) | AnalyticDB for MySQL 3.0, PolarDB for PostgreSQL (Compatible with Oracle) |
| PolarDB-X 1.0 | Kafka, Tablestore |
| PolarDB-X 2.0 |
|
| Self-managed Db2 for LUW | MySQL |
| Self-managed Db2 for i | MySQL |
| PolarDB for PostgreSQL | PolarDB for PostgreSQL, PostgreSQL |
| PostgreSQL | PolarDB for PostgreSQL, PostgreSQL |
| TiDB | PolarDB for MySQL, MySQL, AnalyticDB for MySQL 3.0 |
| MongoDB | Lindorm |
Konfigurasikan ETL saat membuat tugas sinkronisasi
Topik ini menggunakan tugas sinkronisasi sebagai contoh. Langkah konfigurasi untuk tugas migrasi serupa.
Catatan penggunaan
| Batasan | Konsekuensi jika dilanggar |
|---|---|
| Skrip DSL bersifat case-sensitive. Nama database, tabel, dan bidang harus persis sesuai dengan sumber. | Skrip gagal mencocokkan catatan tanpa pemberitahuan, atau tugas melaporkan error. |
| Semua bidang yang dirujuk dalam skrip DSL harus ada di database sumber dan tidak boleh difilter oleh kondisi filter. | Tugas gagal dengan error field-not-found. |
Skrip DSL hanya mendukung satu ekspresi tingkat atas. Gunakan e_compose untuk menggabungkan beberapa operasi. | Tugas menolak skrip saat validasi. |
Jika skrip DSL menambahkan kolom baru, tambahkan kolom tersebut ke tabel tujuan secara manual sebelum memulai tugas. Misalnya, jika skrip menggunakan e_set(new_column, dt_now()), tambahkan new_column ke tabel tujuan terlebih dahulu. | Skrip ETL tidak berpengaruh karena kolom tujuan tidak ada. |
Setelah pemrosesan DSL, perubahan DML untuk semua tabel harus menghasilkan informasi kolom yang konsisten. Misalnya, jika e_set menambahkan kolom, operasi INSERT, UPDATE, dan DELETE semuanya harus menghasilkan penambahan kolom tersebut. | Tugas mungkin gagal karena inkonsistensi skema antar jenis operasi. |
| Skrip DSL hanya untuk transformasi dan pembersihan data. | Pembuatan objek database (seperti CREATE TABLE) tidak didukung dan akan gagal. |
Prosedur
Buat tugas sinkronisasi. Untuk detailnya, lihat Solusi sinkronisasi.
Pada langkah Advanced Configurations, atur Configure ETL ke Yes.
Masukkan skrip DSL Anda di kotak teks berdasarkan sintaks DSL pemrosesan data.
Untuk menyaring catatan di mana
idlebih besar dari 3, gunakane_if(op_gt(id, 3), e_drop()). Ini akan membuang catatan apa pun yang nilaiid-nya melebihi 3, sehingga tidak disinkronkan ke tujuan.
Selesaikan langkah-langkah berikutnya sesuai kebutuhan.
Ubah konfigurasi ETL pada tugas sinkronisasi yang sudah ada
Untuk memperbarui konfigurasi ETL pada tugas sinkronisasi yang sudah ada, pilih salah satu opsi berikut:
Jika Configure ETL diatur ke No, ubah menjadi Yes dan masukkan skrip DSL.
Jika Configure ETL diatur ke Yes, modifikasi skrip DSL atau atur kembali Configure ETL ke No.
Sebelum memodifikasi skrip DSL, pindahkan objek sinkronisasi dari daftar Selected Objects kembali ke daftar Source Objects, lalu tambahkan kembali. Melewatkan langkah ini dapat menyebabkan tugas berada dalam keadaan tidak konsisten.
Konfigurasi ETL tidak dapat dimodifikasi untuk tugas migrasi. Hanya tugas sinkronisasi yang mendukung operasi ini.
Catatan penggunaan
| Batasan | Konsekuensi jika dilanggar |
|---|---|
| Memodifikasi konfigurasi ETL dapat mengganggu tugas yang sedang berjalan. | Sinkronisasi data berhenti sementara selama pembaruan. Lakukan selama jendela pemeliharaan. |
| Perubahan hanya berlaku untuk data inkremental setelah tugas dimulai ulang. Data historis yang sudah disinkronkan tidak diproses ulang. | Catatan yang disinkronkan sebelum modifikasi tidak terpengaruh—ini merupakan desain yang disengaja. |
| Perubahan skema tabel tujuan tidak didukung selama modifikasi ETL. | Untuk mengubah skema, perbarui tabel tujuan sebelum memulai tugas sinkronisasi. |
| Batasan skrip DSL (case sensitivity, keberadaan bidang, ekspresi tunggal, kolom baru) sama seperti untuk tugas baru. | Konsekuensinya sama seperti yang dijelaskan dalam catatan penggunaan tugas baru di atas. |
Prosedur
Masuk ke atau halaman Tugas Sinkronisasi Data di konsol DTS baru.
Pada baris tugas sinkronisasi target, klik ikon
dan pilih Modify ETL Configurations.Pada langkah Advanced Configurations, atur Configure ETL ke Yes.
Masukkan skrip DSL yang diperbarui di kotak teks.
Untuk menyaring catatan di mana
idlebih besar dari 3, gunakane_if(op_gt(id, 3), e_drop()). Ini akan membuang catatan apa pun yang nilaiid-nya melebihi 3, sehingga tidak disinkronkan ke tujuan.
Selesaikan langkah-langkah berikutnya sesuai kebutuhan.
Contoh skrip ETL
Contoh berikut mencakup skenario paling umum. Masing-masing menggunakan fungsi DSL yang dijelaskan di bagian referensi sintaks DSL.
Penyaringan data
Gunakan penyaringan data untuk menyinkronkan hanya subset catatan—misalnya mereplikasi pesanan terbaru ke database analitik, mengecualikan data uji dari sinkronisasi produksi, atau menerapkan aturan residensi data berbasis wilayah dengan membuang catatan yang tidak relevan.
Buang catatan di mana
id> 10000:e_if(op_gt(`id`, 10000), e_drop())Buang catatan di mana
namemengandung "hangzhou":e_if(str_contains(`name`, "hangzhou"), e_drop())Buang pesanan yang dibuat sebelum tanggal batas:
e_if(op_lt(`order_timestamp`, "2015-02-23 23:54:55"), e_drop())Buang catatan yang memenuhi beberapa kondisi (AND):
e_if(op_and(str_contains(`name`, "hangzhou"), op_gt(`id`, 1000)), e_drop())Buang catatan yang memenuhi salah satu kondisi (OR):
e_if(op_or(str_contains(`name`, "hangzhou"), op_gt(`id`, 1000)), e_drop())
Penyamaran data
Gunakan penyamaran data ketika database tujuan diakses oleh audiens yang lebih luas daripada sumber—misalnya saat menyinkronkan data produksi ke sistem pelaporan atau berbagi data dengan pihak ketiga. Penyamaran memungkinkan Anda melindungi informasi identitas pribadi (PII) sekaligus mempertahankan data untuk analitik.
Ganti empat digit terakhir nomor telepon (posisi 7–10) dengan tanda bintang:
e_set(`phone`, str_mask(`phone`, 7, 10, '*'))Pelacakan perubahan
Gunakan pelacakan perubahan ketika konsumen downstream perlu mengetahui kapan baris terakhir dimodifikasi—misalnya untuk mengimplementasikan pipeline pemrosesan inkremental, mendeteksi catatan kedaluwarsa, atau mengaudit kesegaran data tanpa mengkueri database sumber.
Sebelum memulai tugas, tambahkan kolom dts_sync_time ke tabel tujuan.
Tambahkan kolom dts_sync_time ke semua tabel untuk operasi INSERT, UPDATE, dan DELETE:
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__))Untuk menerapkan ini hanya pada tabel tertentu (misalnya, dts_test_table):
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__))Pencatatan audit
Gunakan pencatatan audit ketika Anda memerlukan riwayat lengkap perubahan data di tabel tujuan—misalnya untuk memenuhi persyaratan kepatuhan, mendukung skenario rollback, atau membangun log perubahan tanpa sistem audit terpisah. Pola ini menulis setiap perubahan masuk sebagai INSERT, sehingga tabel tujuan mengumpulkan catatan lengkap semua modifikasi.
Sebelum memulai tugas, tambahkan kolom operation_type dan updated ke tabel tujuan.
Tulis jenis operasi DML dan stempel waktu commit ke baris tujuan, lalu ubah semua operasi menjadi INSERT:
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__)
)Membedakan data penuh dan inkremental
Gunakan pola ini ketika tabel tujuan menerima data migrasi penuh dan perubahan inkremental, serta konsumen downstream perlu membedakannya—misalnya untuk melewatkan pemrosesan ulang baris historis dalam pipeline streaming, atau memvalidasi bahwa muatan awal telah selesai sebelum menerapkan logika inkremental.
Selama migrasi penuh, __COMMIT_TIMESTAMP__ bernilai 0 (1970-01-01 08:00:00, disesuaikan dengan zona waktu lokal). Selama migrasi inkremental, nilainya adalah waktu commit log aktual. Skrip berikut menulis True atau False ke kolom is_increment_dml:
e_if_else(__COMMIT_TIMESTAMP__ > DATETIME('2000-01-01 00:00:00'),
e_set(`is_increment_dml`, True),
e_set(`is_increment_dml`, False)
)Referensi sintaks DSL
Variabel bawaan
Variabel bawaan berikut tersedia di semua skrip DSL.
| Variabel | Deskripsi | Tipe data | Nilai contoh |
|---|---|---|---|
__TB__ | Nama tabel | string | table |
__DB__ | Nama database | string | mydb |
__OPERATION__ | Jenis operasi DML | string | __OP_INSERT__, __OP_UPDATE__, __OP_DELETE__ |
__BEFORE__ | Gambar sebelum UPDATE (nilai sebelum perubahan). Operasi DELETE hanya memiliki gambar sebelum. | Tanda khusus | v(column_name,__BEFORE__) |
__AFTER__ | Gambar setelah UPDATE (nilai setelah perubahan). Operasi INSERT hanya memiliki gambar setelah. | Tanda khusus | v(column_name,__AFTER__) |
__COMMIT_TIMESTAMP__ | Waktu commit transaksi | datetime | '2021-01-01 10:10:01' |
` column ` | Nilai kolom yang ditentukan dalam catatan saat ini | string | ` id , name ` |
Konstanta
| Tipe | Contoh |
|---|---|
| int | 123 |
| float | 123.4 |
| string | "hello1_world" |
| boolean | true atau false |
| datetime | DATETIME('2021-01-01 10:10:01') |
Fungsi ekspresi
Operasi numerik
| Operasi | Sintaks | Parameter | Nilai kembalian | Contoh |
|---|---|---|---|---|
| Penjumlahan | op_sum(value1, value2) | integer atau float | Integer jika kedua input integer; selain itu float | op_sum(col1, 1.0) |
| Pengurangan | op_sub(value1, value2) | integer atau float | Integer jika kedua input integer; selain itu float | op_sub(col1, 1.0) |
| Perkalian | op_mul(value1, value2) | integer atau float | Integer jika kedua input integer; selain itu float | op_mul(col1, 1.0) |
| Pembagian | op_div_true(value1, value2) | integer atau float | Integer jika kedua input integer; selain itu float | op_div_true(col1, 2.0) — jika col1=15, mengembalikan 7.5 |
| Modulo | op_mod(value1, value2) | integer atau float | Integer jika kedua input integer; selain itu float | op_mod(col1, 10) — jika col1=23, mengembalikan 3 |
Operasi logika
| Operasi | Sintaks | Parameter | Nilai kembalian | Contoh |
|---|---|---|---|---|
| Sama dengan | op_eq(value1, value2) | integer, float, atau string | boolean | op_eq(col1, 23) |
| Lebih besar dari | op_gt(value1, value2) | integer, float, atau string | boolean | op_gt(col1, 1.0) |
| Lebih kecil dari | op_lt(value1, value2) | integer, float, atau string | boolean | op_lt(col1, 1.0) |
| Lebih besar dari atau sama dengan | op_ge(value1, value2) | integer, float, atau string | boolean | op_ge(col1, 1.0) |
| Lebih kecil dari atau sama dengan | op_le(value1, value2) | integer, float, atau string | boolean | op_le(col1, 1.0) |
| AND | op_and(value1, value2) | boolean | boolean | op_and(is_male, is_student) |
| OR | op_or(value1, value2) | boolean | boolean | op_or(is_male, is_student) |
| IN | op_in(value, json_array) | tipe apa pun; string array JSON | boolean | op_in(id,json_array('["0","1","2","3"]')) |
| Is null | op_is_null(value) | tipe apa pun | boolean | op_is_null(name) |
| Is not null | op_is_not_null(value) | tipe apa pun | boolean | op_is_not_null(name) |
Fungsi string
| Operasi | Sintaks | Parameter | Nilai kembalian | Contoh |
|---|---|---|---|---|
| Menggabungkan string | op_add(str_1, str_2, ..., str_n) | string | String gabungan | op_add(col,'hangzhou','dts') |
| Format dan gabungkan | str_format(format, value1, value2, ...) | format: string dengan placeholder {}; nilai: apa pun | String terformat | str_format("part1: {}, part2: {}", col1, col2) — jika col1="ab" dan col2="12", mengembalikan "part1: ab, part2: 12" |
| Ganti substring | str_replace(original, oldStr, newStr, count) | count: jumlah maksimum penggantian; -1 mengganti semua | String setelah penggantian | str_replace(name, "a", 'b', -1) — jika name="aba", mengembalikan "bbb" |
| Ganti di semua bidang bertipe string | tail_replace_string_field(search, replace, all) | all: harus true | String setelah penggantian | tail_replace_string_field('\u000f','',true) — mengganti \u000f dengan string kosong di semua bidang varchar, text, dan char |
| Hapus karakter dari kedua ujung | str_strip(string_val, charSet) | charSet: karakter yang akan dihapus | String setelah di-strip | str_strip(name, 'ab') — jika name="axbzb", mengembalikan "xbz" |
| Huruf kecil | str_lower(value) | string | String huruf kecil | str_lower(str_col) |
| Huruf besar | str_upper(value) | string | String huruf besar | str_upper(str_col) |
| String ke integer | cast_string_to_long(value) | string | Integer | cast_string_to_long(col) |
| Integer ke string | cast_long_to_string(value) | integer | String | cast_long_to_string(col) |
| Hitung kemunculan substring | str_count(str, pattern) | string; substring | Integer | str_count(str_col, 'abc') — jika str_col="zabcyabcz", mengembalikan 2 |
| Temukan posisi substring | str_find(str, pattern) | string; substring | Posisi kecocokan pertama; -1 jika tidak ditemukan | str_find(str_col, 'abc') — jika str_col="xabcy", mengembalikan 1 |
| Periksa apakah alfabet | str_isalpha(str) | string | boolean | str_isalpha(str_col) |
| Periksa apakah numerik | str_isdigit(str) | string | boolean | str_isdigit(str_col) |
| Pencocokan ekspresi reguler | regex_match(str, regex) | string; string regex | boolean | regex_match(__TB__,'user_\\\d+') |
| Menyamarkan substring | str_mask(str, start, end, maskStr) | start min: 0; end maks: panjang−1; maskStr: satu karakter | String yang disamarkan | str_mask(phone, 7, 10, '#') |
| Substring setelah penanda | substring_after(str, cond) | string; string penanda | String setelah penanda (penanda tidak termasuk) | substring_after(col, 'abc') |
| Substring sebelum penanda | substring_before(str, cond) | string; string penanda | String sebelum penanda (penanda tidak termasuk) | substring_before(col, 'efg') |
| Substring di antara dua penanda | substring_between(str, cond1, cond2) | string; dua string penanda | String di antara penanda (penanda tidak termasuk) | substring_between(col, 'abc','efg') |
| Periksa apakah nilai bertipe string | is_string_value(value) | string atau nama kolom | boolean | is_string_value(col1) |
| Mendapatkan bidang dokumen MongoDB | bson_value("field1", "field2", ...) | nama bidang di setiap level | Nilai bidang | e_set(user_name, bson_value("person","name")) |
Fungsi waktu
| Operasi | Sintaks | Parameter | Nilai kembalian | Contoh |
|---|---|---|---|---|
| Waktu sistem saat ini (presisi detik) | dt_now() | Tidak ada | datetime | dt_now() |
| Waktu sistem saat ini (presisi milidetik) | dt_now_millis() | Tidak ada | datetime | dt_now_millis() |
| Timestamp UTC (detik) ke datetime | dt_fromtimestamp(value, [timezone]) | integer; zona waktu opsional | datetime (presisi detik) | dt_fromtimestamp(1626837629,'GMT+08') |
| Timestamp UTC (milidetik) ke datetime | dt_fromtimestamp_millis(value, [timezone]) | integer; zona waktu opsional | datetime (presisi milidetik) | dt_fromtimestamp_millis(1626837629123,'GMT+08') |
| Datetime ke timestamp UTC (detik) | dt_parsetimestamp(value, [timezone]) | datetime; zona waktu opsional | Integer | dt_parsetimestamp(datetime_col,'GMT+08') |
| Datetime ke timestamp UTC (milidetik) | dt_parsetimestamp_millis(value, [timezone]) | datetime; zona waktu opsional | Integer | dt_parsetimestamp_millis(datetime_col,'GMT+08') |
| Datetime ke string | dt_str(value, format) | datetime; string format | String | dt_str(col1, 'yyyy-MM-dd HH:mm:ss') |
| String ke datetime | dt_strptime(value, format) | string; string format | datetime | dt_strptime('2021-07-21 03:20:29', 'yyyy-MM-dd hh:mm:ss') |
| Tambah atau kurangi satuan waktu | dt_add(value, [years=n], [months=n], [days=n], [hours=n], [minutes=n]) | datetime; offset integer (negatif untuk pengurangan) | datetime | dt_add(datetime_col, years=-1) |
Ekspresi kondisional
| Sintaks | Deskripsi | Contoh |
|---|---|---|
(cond ? val_1 : val_2) | Operator ternary. Mengembalikan val_1 jika cond bernilai true; selain itu val_2. val_1 dan val_2 harus bertipe sama. | (id>1000 ? 1 : 0) |
Fungsi JSON
Tipe value merepresentasikan tipe bidang apa pun di database.| Operasi | Sintaks | Parameter | Nilai kembalian | Contoh |
|---|---|---|---|---|
| Konversi string array JSON ke himpunan | json_array(arrayText) — hanya dapat digunakan dalam ekspresi boolean | arrayText: string array JSON | Koleksi himpunan | op_in(id,json_array('["0","1","2","3"]')) |
| Buat array JSON | json_array2(item...) | item bertipe apa pun | Array JSON | json_array2("0","1","2","3") mengembalikan ["0","1","2","3"] |
| Buat objek JSON | json_object(item...) | pasangan kunci-nilai (kunci bertipe string, nilai bertipe apa pun) | JSON | json_object('name','ZhangSan','age',32,'loginId',100) mengembalikan {"name":"ZhangSan","age":32,"loginId":100} |
| Sisipkan ke array JSON pada posisi tertentu | json_array_insert(json, kvPairs...) | Posisi JSONPath; data yang akan disisipkan. Jika posisi tidak ada, mengembalikan JSON asli. Jika elemen tidak ada, menambahkan ke akhir array. | JSON | json_array_insert('{"Address":["City",1]}','$.Address[3]',100) mengembalikan {"Address":["City",1,100]} |
| Sisipkan ke objek JSON (hanya jika belum ada) | json_insert(json, kvPairs...) | Posisi JSONPath; data yang akan disisipkan. Jika posisi sudah ada, mengembalikan JSON asli. | JSON | json_insert('{"Address":["City","Xian","Number",1]}','$.ID',100) mengembalikan {"Address":["City","Xian","Number",1],"ID":100} |
| Sisipkan atau perbarui pada path JSON | json_set(json, kvPairs...) | Posisi JSONPath; data. Memperbarui jika posisi ada; menyisipkan jika belum ada. | tipe value | json_set('{"ID":1,"Address":["City","Xian","Number",1]}',"$.IP",100) mengembalikan {"ID":1,"Address":["City","Xian","Number",1],"IP":100} |
| Sisipkan atau perbarui pasangan kunci-nilai | json_put(json, key, value) | Objek JSON; string kunci; nilai. Mengembalikan null jika json bukan objek JSON. | JSON | json_put('{"loginId":100}','loginTime','2024-10-10') mengembalikan {"loginId":100,"loginTime":"2024-10-10"} |
| Ganti pada path JSON | json_replace(json, kvPairs...) | Posisi JSONPath; data pengganti. Jika posisi tidak ada, mengembalikan JSON asli. | tipe value | json_replace('{"ID":1,"Address":["City","Xian","Number",1]}',"$.IP",100) mengembalikan JSON asli (posisi tidak ada) |
| Periksa apakah nilai ada pada path JSON | json_contains(json, jsonPath, item) | Objek JSON; JSONPath; data yang akan diperiksa | boolean | json_contains('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID',1) mengembalikan true |
| Periksa apakah path JSON ada | json_contains_path(json, jsonPath) | Objek JSON; JSONPath | boolean | json_contains_path('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID') mengembalikan true |
| Dapatkan nilai pada path JSON | json_extract(json, jsonPath) | Objek JSON; JSONPath | tipe nilai | json_extract('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID') mengembalikan 1 |
| Dapatkan nilai berdasarkan nama kunci | json_get(json, key) | Objek JSON; string kunci | tipe value | json_get('{"ID":1,"Address":["City","Xian","Number",1]}','ID') mengembalikan 1 |
| Dapatkan semua kunci pada path JSON | json_keys(json, jsonPath) | Objek JSON; JSONPath | Array JSON | json_keys('{"ID":1,"Address":["City","Xian","Number",1]}','$') mengembalikan ["ID","Address"] |
| Dapatkan jumlah kunci pada path JSON | json_length(json, jsonPath) | Objek JSON; JSONPath ("$" setara dengan json_length(json)) | Integer | json_length('{"ID":1,"Address":["City","Xian","Number",1]}','$') mengembalikan 2 |
| Dapatkan jumlah kunci root | json_length(json) | Objek JSON | Integer | json_length('{"ID":1,"Address":["City","Xian","Number",1]}') mengembalikan 2 |
| Parsing string JSON | json_parse(json) | String JSON | tipe value | json_parse('{"ID":1}') mengembalikan {"ID":1} |
| Hapus nilai pada path JSON | json_remove(json, jsonPath) | Objek JSON; JSONPath | JSON | json_remove('{"loginId":100,"loginTime":"2024-10-10"}','$.loginTime') mengembalikan {"loginId":100} |
Fungsi global
Fungsi kontrol alur
| Fungsi | Sintaks | Deskripsi | Contoh |
|---|---|---|---|
| If | e_if(bool_expr, func_invoke) | Menjalankan func_invoke jika bool_expr bernilai true. | e_if(op_gt(id, 10), e_drop()) — membuang catatan di mana id > 10 |
| If-else | e_if_else(bool_expr, func_invoke1, func_invoke2) | Menjalankan func_invoke1 jika true; menjalankan func_invoke2 jika false. | e_if_else(op_gt(id, 10), e_set(tag, 'large'), e_set(tag, 'small')) |
| Switch | e_switch(condition1, func1, condition2, func2, ..., default=default_func) | Mengevaluasi kondisi secara berurutan dan menjalankan yang pertama cocok. Menjalankan default_func jika tidak ada yang cocok. | 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')) |
| Compose | e_compose(func1, func2, func3, ...) | Menjalankan beberapa fungsi secara berurutan sebagai satu ekspresi. | e_compose(e_set(str_col, 'test'), e_set(dt_col, dt_now())) — mengatur dua kolom dalam satu ekspresi |
Fungsi manipulasi data
| Fungsi | Sintaks | Deskripsi | Contoh |
|---|---|---|---|
| Buang catatan | e_drop() | Membuang catatan saat ini. Catatan tidak ditulis ke tujuan. | e_if(op_gt(id, 10), e_drop()) |
| Simpan catatan | e_keep(condition) | Menyimpan catatan hanya jika condition bernilai true. | e_keep(op_gt(id, 1)) — hanya menyinkronkan catatan di mana id > 1 |
| Atur nilai kolom | e_set(col, val, NEW) | Mengatur col ke val. Tambahkan NEW (tanpa koma di depan) untuk mengonversi kolom ke tipe data val. Abaikan NEW dan pastikan kompatibilitas tipe; ketidakcocokan dapat menyebabkan tugas gagal. | e_set(col1, 1, NEW) — mengonversi col1 ke tipe numerik dan mengaturnya ke 1 |
| Pemetaan bidang MongoDB | e_expand_bson_value('*', 'fieldA', {"fieldB":"fieldC"}) | Memilih bidang yang akan disimpan (* = semua), membuang fieldA, dan mengganti nama fieldB menjadi fieldC. Pemetaan nama bidang bersifat opsional. | e_expand_bson_value("*", "_id,name") — menulis semua bidang kecuali _id dan name ke tujuan |
Langkah selanjutnya
Untuk referensi sintaks DSL berbasis SLS lengkap, lihat Ikhtisar sintaks.
Untuk membuat tugas sinkronisasi, lihat Solusi sinkronisasi.