All Products
Search
Document Center

Data Transmission Service:Konfigurasikan ETL dalam tugas migrasi atau sinkronisasi DTS

Last Updated:Jul 24, 2026

Data Transmission Service (DTS) mendukung pemrosesan ETL (extract, transform, and load) berbasis aliran dalam tugas migrasi dan sinkronisasi. Anda dapat mengonfigurasi ETL untuk menyaring data, menyamarkan bidang sensitif, mencatat stempel waktu modifikasi, serta mengaudit perubahan data menggunakan bahasa skrip DSL.

Informasi latar belakang

Saat Anda perlu mentransformasi atau menyaring data real-time sebelum menuliskannya ke database tujuan, gunakan fitur ETL berbasis aliran DTS. Logika ETL didefinisikan melalui bahasa skrip domain-spesifik (DSL). Untuk ikhtisar DSL dan sintaksnya, lihat Pengenalan sintaks DSL pemrosesan data.

DTS mendukung konfigurasi ETL dengan dua cara:

Catatan

Baik tugas migrasi DTS maupun tugas sinkronisasi mendukung konfigurasi ETL. Topik ini menggunakan tugas sinkronisasi sebagai contoh. Metode konfigurasi untuk tugas migrasi serupa.

Database yang didukung

Tabel berikut mencantumkan database sumber dan tujuan yang didukung untuk ETL.

Source database

Destination database

SQL Server

  • AnalyticDB for MySQL 3.0

  • SQL Server

  • MySQL

  • PolarDB for MySQL

MySQL

  • AnalyticDB for MySQL 3.0

  • AnalyticDB for PostgreSQL

  • Kafka

  • 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

  • AnalyticDB for MySQL 3.0

  • MySQL

  • PolarDB for MySQL

  • Elasticsearch

PolarDB for PostgreSQL (Compatible with Oracle)

  • AnalyticDB for MySQL 3.0

  • PolarDB for PostgreSQL (Compatible with Oracle)

PolarDB-X 1.0

  • Kafka

  • Tablestore

  • Elasticsearch

PolarDB-X 2.0

  • PolarDB-X 2.0

  • AnalyticDB for MySQL 3.0

  • MySQL

  • PolarDB for MySQL

  • Elasticsearch

Self-managed Db2 for LUW

MySQL

Self-managed Db2 for i

MySQL

PolarDB for PostgreSQL

  • PolarDB for PostgreSQL

  • PostgreSQL

PostgreSQL

  • PolarDB for PostgreSQL

  • PostgreSQL

  • ApsaraDB SelectDB Edition

TiDB

  • PolarDB for MySQL

  • MySQL

  • AnalyticDB for MySQL 3.0

MongoDB

Lindorm

Konfigurasikan ETL saat membuat tugas sinkronisasi

Catatan

  • Jika skrip ETL Anda menambahkan kolom baru, tambahkan secara manual kolom tersebut ke database tujuan. Jika tidak, skrip ETL tidak akan berlaku. Misalnya, dalam e_set(`new_column`, dt_now()), Anda harus menambahkan secara manual new_column ke database tujuan.

  • Skrip DSL hanya menangani operasi transformasi dan pembersihan data. Skrip ini tidak mendukung pembuatan objek database.

  • Bidang yang dirujuk dalam skrip DSL harus ada di database sumber dan tidak boleh difilter oleh kondisi filter apa pun. Jika tidak, tugas mungkin gagal.

  • Skrip DSL bersifat case-sensitive. Nama database, nama tabel, dan nama bidang harus persis sama dengan yang ada di database sumber.

  • Skrip DSL tidak mendukung beberapa ekspresi. Gunakan fungsi e_compose untuk menggabungkan beberapa ekspresi menjadi satu.

  • Semua perubahan DML dari semua tabel di database sumber harus menghasilkan informasi kolom yang identik setelah pemrosesan DSL. Jika tidak, tugas mungkin gagal. Misalnya, jika Anda menggunakan fungsi e_set untuk menambahkan kolom, pastikan operasi INSERT, UPDATE, dan DELETE dari database sumber semuanya menghasilkan kolom tambahan yang sama di tabel tujuan. Untuk informasi lebih lanjut, lihat Catat waktu modifikasi data.

Prosedur

  1. Buat tugas sinkronisasi. Untuk detailnya, lihat Ikhtisar solusi sinkronisasi.

  2. Pada langkah Advanced Configurations, atur Configure ETL ke Yes.

  3. Di kotak input, masukkan pernyataan ETL Anda menggunakan sintaks DSL pemrosesan data.

    Catatan

    Sebagai contoh, untuk menghapus catatan di mana id lebih besar dari 3, gunakan e_if(op_gt(`id`, 3), e_drop()). Di sini, op_gt adalah fungsi ekspresi yang memeriksa apakah suatu nilai lebih besar dari nilai lain, dan id adalah variabel. Skrip ini menyaring catatan di mana id > 3.

  4. Selesaikan langkah-langkah tersisa sesuai kebutuhan.

Ubah konfigurasi ETL pada tugas sinkronisasi yang sudah ada

Mengubah konfigurasi ETL pada tugas sinkronisasi yang sudah ada mencakup:

  • Jika Anda memiliki tugas sinkronisasi yang belum dikonfigurasi ETL—artinya saat membuat tugas sinkronisasi, Configure ETL diatur ke No—Anda dapat mengubah No menjadi Yes dan mengonfigurasi skrip DSL.

  • Jika ETL sudah dikonfigurasi, Anda dapat mengubah skrip DSL yang ada atau mengatur Configure ETL ke No.

    Penting
    • Untuk mengubah skrip DSL yang ada, pertama-tama pindahkan objek sinkronisasi dari Selected Objects kembali ke Source Objects, lalu tambahkan kembali ke Selected Objects sebelum mengedit skrip DSL.

    • Tugas migrasi tidak mendukung pengubahan skrip DSL.

Catatan

  • Mengubah konfigurasi ETL pada tugas sinkronisasi yang sudah ada tidak mendukung perubahan skema tabel di database tujuan. Untuk mengubah skema, lakukan di database tujuan sebelum memulai tugas sinkronisasi.

  • Mengubah konfigurasi ETL dapat mengganggu tautan data. Lakukan dengan hati-hati.

  • Perubahan konfigurasi ETL hanya berlaku untuk data inkremental yang diproses setelah tugas dimulai ulang. Perubahan ini tidak memengaruhi data historis yang telah diproses sebelumnya.

  • Skrip DSL hanya menangani operasi transformasi dan pembersihan data. Skrip ini tidak mendukung pembuatan objek database.

  • Bidang yang dirujuk dalam skrip DSL harus ada di database sumber dan tidak boleh difilter oleh kondisi filter apa pun. Jika tidak, tugas mungkin gagal.

  • Skrip DSL bersifat case-sensitive. Nama database, nama tabel, dan nama bidang harus persis sama dengan yang ada di database sumber.

  • Skrip DSL tidak mendukung beberapa ekspresi. Gunakan fungsi e_compose untuk menggabungkan beberapa ekspresi menjadi satu.

  • Semua perubahan DML dari semua tabel di database sumber harus menghasilkan informasi kolom yang identik setelah pemrosesan DSL. Jika tidak, tugas mungkin gagal. Misalnya, jika Anda menggunakan fungsi e_set untuk menambahkan kolom, pastikan operasi INSERT, UPDATE, dan DELETE dari database sumber semuanya menghasilkan kolom tambahan yang sama di tabel tujuan. Untuk informasi lebih lanjut, lihat Catat waktu modifikasi data.

Prosedur

  1. Masuk ke halaman daftar tugas sinkronisasi DTS baru.

  2. Pada tugas sinkronisasi target, klik 点点点 dan pilih Modify ETL Configurations.

  3. Pada langkah Advanced Configurations, atur Configure ETL ke Yes.

  4. Di kotak input, masukkan pernyataan ETL Anda menggunakan sintaks DSL pemrosesan data.

    Catatan

    Sebagai contoh, untuk menghapus catatan di mana id lebih besar dari 3, gunakan e_if(op_gt(`id`, 3), e_drop()). Di sini, op_gt adalah fungsi ekspresi yang memeriksa apakah suatu nilai lebih besar dari nilai lain, dan id adalah variabel. Skrip ini menyaring catatan di mana id > 3.

  5. Selesaikan langkah-langkah tersisa sesuai kebutuhan.

Pengenalan sintaks DSL pemrosesan data

DSL pemrosesan data adalah bahasa skrip untuk mendefinisikan logika ETL dalam skenario sinkronisasi DTS. DSL ini mendukung fungsi kondisional dan menangani string, tanggal, serta nilai numerik dengan fitur-fitur berikut:

  • Fungsionalitas kuat: Menyediakan banyak fungsi dan mendukung komposisi fungsi.

  • Sintaks relatif sederhana: Menyertakan contoh untuk skenario umum seperti penyaringan data, transformasi, dan penyamaran. Untuk detailnya, lihat Contoh skenario khas.

  • Efisiensi eksekusi tinggi: Menggunakan teknologi generasi kode untuk meminimalkan dampak performa pada proses sinkronisasi.

Catatan
  • Dalam sintaks DSL, nama kolom menggunakan backtick (``), bukan tanda kutip tunggal ('').

  • Produk ini merujuk sintaks pemrosesan data SLS. Produk ini mendukung fungsi JSON tetapi tidak mendukung fungsi pemisahan event. Untuk sintaks SLS, lihat Pengenalan sintaks.

Contoh skenario khas

Penyaringan data

  • Filter berdasarkan kolom numerik: Hapus catatan di mana id > 10000 agar tidak disinkronkan: e_if(op_gt(`id`, 10000), e_drop()).

  • Filter berdasarkan kecocokan string: Hapus catatan di mana name mengandung "hangzhou": e_if(str_contains(`name`, "hangzhou"), e_drop()).

  • Filter berdasarkan tanggal: Jangan sinkronkan catatan di mana order_timestamp lebih awal dari waktu tertentu: e_if(op_lt(`order_timestamp`, "2015-02-23 23:54:55"), e_drop()).

  • Filter berdasarkan beberapa kondisi:

    • Hapus catatan di mana id > 1000 dan name mengandung "hangzhou": e_if(op_and(str_contains(`name`, "hangzhou"), op_gt(`id`, 1000)), e_drop()).

    • Hapus catatan di mana id > 1000 atau name mengandung "hangzhou": e_if(op_or(str_contains(`name`, "hangzhou"), op_gt(`id`, 1000)), e_drop()).

Penyamaran data

Penyamaran: Ganti empat digit terakhir kolom nomor telepon dengan tanda bintang: e_set(`phone`, str_mask(`phone`, 7, 10, '*')).

Catat waktu modifikasi data

  • Tambahkan kolom ke semua tabel: Saat __OPERATION__ adalah INSERT, UPDATE, atau DELETE, tambahkan kolom bernama "dts_sync_time" dengan nilai stempel waktu commit log (__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__))
  • Tambahkan kolom ke tabel tertentu "dts_test_table": Saat __OPERATION__ adalah INSERT, UPDATE, atau DELETE, tambahkan kolom bernama "dts_sync_time" dengan nilai stempel waktu commit log (__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__))
    Catatan

    Anda harus menambahkan secara manual kolom "dts_sync_time" ke tabel tujuan sebelum memulai tugas.

Audit perubahan data

Catat jenis dan waktu perubahan data: Tulis jenis perubahan ke kolom "operation_type" dan stempel waktu perubahan ke kolom "updated" di database tujuan.

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__)
)
Catatan

Anda harus menambahkan kolom "operation_type" dan "updated" ke tabel tujuan sebelum memulai tugas.

Membedakan antara data penuh dan data inkremental

Catat apakah data berasal dari migrasi penuh atau inkremental di kolom is_increment_dml. Anda dapat membedakan antara migrasi penuh dan inkremental dengan memeriksa nilai __COMMIT_TIMESTAMP__. Dalam migrasi penuh, __COMMIT_TIMESTAMP__ bernilai 0 (1970-01-01 08:00:00, dipengaruhi zona waktu). Dalam migrasi inkremental, nilainya mencerminkan waktu penulisan log database sumber. Skrip ETL yang sesuai adalah:

e_if_else(__COMMIT_TIMESTAMP__ > DATETIME('2000-01-01 00:00:00'), 
    e_set(`is_increment_dml`, True),
    e_set(`is_increment_dml`, False)
)

Sintaks DSL pemrosesan data

Konstanta dan variabel

  • Konstanta

    Type

    Example

    int

    123

    float

    123.4

    string

    "hello1_world"

    boolean

    true or false

    datetime

    DATETIME('2021-01-01 10:10:01')

  • Variabel

    Variable

    Description

    Data type

    Example value

    __TB__

    Table name

    string

    table

    __DB__

    Database name

    string

    mydb

    __OPERATION__

    Operation type

    string

    __OP_INSERT__, __OP_UPDATE__, __OP_DELETE__

    __BEFORE__

    Nilai pre-image untuk operasi UPDATE (nilai sebelum perubahan)

    Catatan

    Operasi DELETE hanya memiliki nilai pre-image.

    Special marker, no type

    v(`column_name`,__BEFORE__)

    __AFTER__

    Nilai post-image untuk operasi UPDATE (nilai setelah perubahan)

    Catatan

    Operasi INSERT hanya memiliki nilai post-image.

    Special marker, no type

    v(`column_name`,__AFTER__)

    __COMMIT_TIMESTAMP__

    Waktu commit transaksi

    datetime

    '2021-01-01 10:10:01'

    `column`

    Nilai kolom yang ditentukan untuk suatu catatan

    string

    `id`, `name`

Fungsi ekspresi

  • Operasi numerik

    Function

    Syntax

    Value range

    Return value

    Example

    Addition

    op_sum(value1, value2)

    • value1: integer atau bilangan titik mengambang

    • value2: integer atau bilangan titik mengambang

    Mengembalikan integer jika kedua parameter integer; jika tidak, mengembalikan bilangan titik mengambang.

    op_sum(`col1`, 1.0)

    Subtraction

    op_sub(value1, value2)

    • value1: integer atau bilangan titik mengambang

    • value2: integer atau bilangan titik mengambang

    Mengembalikan integer jika kedua parameter integer; jika tidak, mengembalikan bilangan titik mengambang.

    op_sub(`col1`, 1.0)

    Multiplication

    op_mul(value1, value2)

    • value1: integer atau bilangan titik mengambang

    • value2: integer atau bilangan titik mengambang

    Mengembalikan integer jika kedua parameter integer; jika tidak, mengembalikan bilangan titik mengambang.

    op_mul(`col1`, 1.0)

    Division

    op_div_true(value1, value2)

    • value1: integer atau bilangan titik mengambang

    • value2: integer atau bilangan titik mengambang

    Mengembalikan integer jika kedua parameter integer; jika tidak, mengembalikan bilangan titik mengambang.

    op_div_true(`col1`, 2.0); jika col1=15, mengembalikan 7.5.

    Modulo operation

    op_mod(value1, value2)

    • value1: integer atau bilangan titik mengambang

    • value2: integer atau bilangan titik mengambang

    Mengembalikan integer jika kedua parameter integer; jika tidak, mengembalikan bilangan titik mengambang.

    op_mod(`col1`, 10); jika col1=23, mengembalikan 3.

  • Operasi logis

    Function

    Syntax

    Valid values

    Return value

    Example

    Equality check

    op_eq(value1, value2)

    • value1: integer, bilangan titik mengambang, atau string

    • value2: integer, bilangan titik mengambang, atau string

    Boolean: true atau false

    op_eq(`col1`, 23)

    Greater-than check

    op_gt(value1, value2)

    • value1: integer, bilangan titik mengambang, atau string

    • value2: integer, bilangan titik mengambang, atau string

    Boolean: true atau false

    op_gt(`col1`, 1.0)

    is less than

    op_lt(value1, value2)

    • value1: integer, bilangan titik mengambang, atau string

    • value2: integer, bilangan titik mengambang, atau string

    Boolean: true atau false

    op_lt(`col1`, 1.0)

    Greater-than-or-equal check

    op_ge(value1, value2)

    • value1: integer, bilangan titik mengambang, atau string

    • value2: integer, bilangan titik mengambang, atau string

    Boolean: true atau false

    op_ge(`col1`, 1.0)

    Less-than-or-equal check

    op_le(value1, value2)

    • value1: integer, bilangan titik mengambang, atau string

    • value2: integer, bilangan titik mengambang, atau string

    Boolean: true atau false

    op_le(`col1`, 1.0)

    AND operation

    op_and(value1, value2)

    • value1: boolean

    • value2: boolean

    Boolean: true atau false

    op_and(`is_male`, `is_student`)

    OR operation

    op_or(value1, value2)

    • value1: boolean

    • value2: boolean

    Boolean: true atau false

    op_or(`is_male`, `is_student`)

    IN operation

    op_in(value, json_array)

    • value: tipe apa pun

    • json_array: string berformat JSON

    Boolean: true atau false

    op_in(`id`,json_array('["0","1","2","3","4","5","6","7","8"]'))

    Check if value is null

    op_is_null(value)

    value: tipe apa pun

    Boolean: true atau false

    op_is_null(`name`)

    Check if value is not null

    op_is_not_null(value)

    value: tipe apa pun

    Boolean: true atau false

    op_is_not_null(`name`)

  • Fungsi string

    Function

    Syntax

    Value range

    Return value

    Example

    String concatenation

    op_add(str_1,str_2,...,str_n)

    • str_1: string

    • str_2: string

    • ...

    • str_n: string

    String hasil penggabungan

    op_add(`col`,'hangzhou','dts')

    String formatting and concatenation

    str_format(format, value1, value2, value3, ...)

    • format: string dengan placeholder berupa kurung kurawal, seperti "part1: {}, part2: {}"

    • value1: tipe apa pun

    • value2: tipe apa pun

    String terformat

    str_format("part1: {}, part2: {}", `col1`, `col2`); jika col1="ab" dan col2="12", mengembalikan "part1: ab, part2: 12".

    String replacement

    str_replace(original, oldStr, newStr, count)

    • original: string asli

    • oldStr: string yang akan diganti

    • newStr: string pengganti

    • count: integer, jumlah maksimum penggantian. Atur ke -1 untuk mengganti semua kemunculan.

    String hasil penggantian

    str_replace(`name`, "a", 'b', 1); jika name="aba", mengembalikan "bba". str_replace(`name`, "a", 'b', -1); jika name="aba", mengembalikan "bbb".

    Ganti nilai di semua bidang bertipe string (seperti varchar, text, char)

    tail_replace_string_field(search, replace, all)

    • search: string yang akan diganti

    • replace: string pengganti

    • all: apakah akan mengganti semua kecocokan; saat ini hanya mendukung true.

      Catatan

      Jika Anda tidak ingin mengganti semua kecocokan, gunakan fungsi str_replace.

    String hasil penggantian

    tail_replace_string_field('\u000f', '', true) mengganti semua kemunculan "\u000f" dalam nilai bidang bertipe string dengan spasi.

    Hapus karakter yang ditentukan dari awal dan akhir string

    str_strip(string_val, charSet)

    • string_val: string asli

    • char_set: kumpulan karakter yang akan dihapus

    String dengan karakter awal dan akhir dihapus

    str_strip(`name`, 'ab'); jika name=axbzb, mengembalikan xbz.

    Konversi string ke huruf kecil

    str_lower(value)

    value: kolom string atau literal string

    String huruf kecil

    str_lower(`str_col`)

    Konversi string ke huruf besar

    str_upper(value)

    value: kolom string atau literal string

    String huruf besar

    str_upper(`str_col`)

    Konversi string ke angka

    cast_string_to_long(value)

    value: string

    Integer

    cast_string_to_long(`col`)

    Konversi angka ke string

    cast_long_to_string(value)

    value: integer

    String

    cast_long_to_string(`col`)

    Hitung jumlah kemunculan substring

    str_count(str,pattern)

    • str: kolom string atau literal string

    • pattern: substring yang dicari

    Jumlah kemunculan substring

    str_count(`str_col`, 'abc'); jika str_col="zabcyabcz", mengembalikan 2.

    Temukan posisi substring

    str_find(str, pattern)

    • str: kolom string atau literal string

    • pattern: substring yang dicari

    Posisi kecocokan pertama; mengembalikan `-1` jika tidak ditemukan

    str_find(`str_col`, 'abc'); jika `str_col="xabcy"`, mengembalikan `1`.

    Periksa apakah string hanya terdiri dari huruf

    str_isalpha(str)

    str: kolom string atau literal string

    true atau false

    str_isalpha(`str_col`)

    Periksa apakah string hanya terdiri dari angka

    str_isdigit(str)

    • str: kolom string atau literal string

    true atau false

    str_isdigit(`str_col`)

    Pencocokan ekspresi reguler

    regex_match(str,regex)

    • str: kolom string atau literal string

    • regex: kolom berisi ekspresi reguler atau literal string

    true atau false

    regex_match(__TB__,'user_\\d+')

    Samarkan bagian string dengan karakter tertentu untuk penyamaran data, seperti mengganti empat digit terakhir nomor telepon dengan tanda bintang

    str_mask(str, start, end, maskStr)

    • str: kolom string atau literal string

    • start: integer, posisi awal penyamaran (minimum 0)

    • end: integer, posisi akhir penyamaran (maksimum panjang string minus satu)

    • maskStr: string satu karakter, seperti '#'

    String dengan karakter dari start hingga end disamarkan

    str_mask(`phone`, 7, 10, '#')

    Ekstrak bagian string setelah cond

    substring_after(str, cond)

    • str: string asli

    • cond: string

    String

    Catatan

    Hasil tidak termasuk cond.

    substring_after(`col`, 'abc')

    Ekstrak bagian string sebelum cond

    substring_before(str, cond)

    • str: string asli

    • cond: string

    String

    Catatan

    Hasil tidak termasuk cond.

    substring_before(`col`, 'efg')

    Ekstrak bagian string antara cond1 dan cond2

    substring_between(str, cond1, cond2)

    • str: string asli

    • cond1: string

    • cond2: string

    String

    Catatan

    Hasil tidak termasuk cond1 atau cond2.

    substring_between(`col`, 'abc','efg')

    Periksa apakah nilai bertipe string

    is_string_value(value)

    value: string atau nama kolom

    Boolean: true atau false

    is_string_value(`col1`)

    Ganti konten di bidang bertipe string; dimulai dari akhir secara terbalik

    tail_replace_string_field(search, replace, all)

    search: string yang akan diganti

    replace: string pengganti

    all: apakah akan mengganti semua; true atau false

    String hasil penggantian

    Ganti "\u000f" dengan spasi di semua nilai bidang string.

    tail_replace_string_field('\u000f','',true)

    Ambil nilai bidang di MongoDB

    bson_value("field1","field2","field3",...)

    • field1: nama bidang tingkat atas

    • field2: nama bidang tingkat kedua

    Nilai bidang yang ditentukan dalam dokumen

    • e_set(`user_id`, bson_value("id"))

    • e_set(`user_name`, bson_value("person","name"))

  • Fungsi tanggal dan waktu

    Function

    Syntax

    Value range

    Return value

    Example

    Current system time

    dt_now()

    None

    DATETIME, akurat hingga detik

    dts_now()

    dt_now_millis()

    None

    DATETIME, akurat hingga milidetik

    dt_now_millis()

    Konversi stempel waktu UTC (detik) ke DATETIME

    dt_fromtimestamp(value,[timezone])

    • value: integer

    • timezone: zona waktu (opsional)

    DATETIME, akurat hingga detik

    dt_fromtimestamp(1626837629)

    dt_fromtimestamp(1626837629,'GMT+08')

    Konversi stempel waktu UTC (milidetik) ke DATETIME

    dt_fromtimestamp_millis(value,[timezone])

    • value: integer

    • timezone: zona waktu (opsional)

    DATETIME, akurat hingga milidetik

    dt_fromtimestamp_millis(1626837629123);

    dt_fromtimestamp_millis(1626837629123,'GMT+08')

    Konversi DATETIME ke stempel waktu UTC (detik)

    dt_parsetimestamp(value,[timezone])

    • value: DATETIME

    • timezone: zona waktu (opsional)

    Integer

    dt_parsetimestamp(`datetime_col`)

    dt_parsetimestamp(`datetime_col`,'GMT+08')

    Konversi DATETIME ke stempel waktu UTC (milidetik)

    dt_parsetimestamp_millis(value,[timezone])

    • value: DATETIME

    • timezone: zona waktu (opsional)

    Integer

    dt_parsetimestamp_millis(`datetime_col`)

    dt_parsetimestamp_millis(`datetime_col`,'GMT+08')

    Konversi DATETIME ke string

    dt_str(value, format)

    • value: DATETIME

    • format: string dalam format yyyy-MM-dd HH:mm:ss

    String

    dt_str(`col1`, 'yyyy-MM-dd HH:mm:ss')

    Konversi string ke DATETIME

    dt_strptime(value,format)

    • value: string

    • format: string dalam format yyyy-MM-dd HH:mm:ss

    DATETIME

    dt_strptime('2021-07-21 03:20:29', 'yyyy-MM-dd hh:mm:ss')

    Atur waktu dengan menambah atau mengurangi tahun, bulan, hari, jam, menit, atau detik

    dt_add(value, [years=intVal],

    [months=intVal],

    [days=intVal],

    [hours=intVal],

    [minutes=intVal]

    )

    • value: DATETIME

    • intVal: integer

      Catatan

      Tanda minus (−) menunjukkan pengurangan.

    DATETIME

    • dt_add(datetime_col,years=-1)

    • dt_add(datetime_col,years=1,months=1)

  • Ekspresi kondisional

    Function

    Syntax

    Value range

    Return value

    Example

    Mirip dengan operator ternary (? :) di C, mengembalikan nilai berdasarkan kondisi

    (cond ? val_1 : val_2)

    • cond: bidang boolean atau ekspresi

    • val_1: nilai kembalian 1

    • val_2: nilai kembalian 2

      Catatan

      val_1 dan val_2 harus bertipe sama.

    Mengembalikan val_1 jika cond true; jika tidak, mengembalikan val_2

    (id>1000? 1 : 0)

  • Fungsi JSON

    Catatan

    Tipe nilai merepresentasikan tipe bidang apa pun di database.

    Function

    Syntax

    Value range

    Return value

    Example

    Konversi string array JSON ke Set

    json_array(arrayText)

    Catatan

    Hanya dapat digunakan dalam ekspresi yang mengembalikan boolean.

    arrayText: string, string array JSON yang akan dikonversi

    Set

    op_in(`id`,json_array('["0","1","2","3"]')) mengembalikan Set ["0","1","2","3"].

    Buat array JSON dengan data yang ditentukan

    json_array2(item...)

    item...: tipe nilai, data untuk array JSON

    Array JSON

    json_array2("0","1","2","3") mengembalikan ["0","1","2","3"].

    Buat objek JSON dengan data yang ditentukan

    json_object(item...)

    item...: data objek JSON (pasangan kunci-nilai), terdiri dari nama kunci (string) dan nilai kunci (tipe nilai), dipisahkan koma (,).

    JSON

    json_object('name','ZhangSan','age',32, 'loginId',100) mengembalikan {"name":"ZhangSan","age":32,"loginId":100}.

    Sisipkan data di posisi tertentu (array) dalam objek JSON

    json_array_insert(json, kvPairs...)

    • json: string, objek JSON yang akan dimodifikasi

    • kvPairs...: data yang akan disisipkan. Setiap pasangan terdiri dari JSONPath (string) dan nilai (tipe nilai), dipisahkan koma.

    JSON

    Catatan
    • Jika posisi yang ditentukan tidak ada, mengembalikan objek JSON asli.

    • Jika elemen di posisi yang ditentukan tidak ada, data ditambahkan di akhir array target.

    json_array_insert('{"Address":["City",1]}','$.Address[3]',100) mengembalikan {"Address":["City",1,100]}.

    Sisipkan data di posisi tertentu dalam objek JSON

    json_insert(json, kvPairs...)

    • json: string, objek JSON yang akan dimodifikasi

    • kvPairs...: data yang akan disisipkan. Setiap pasangan terdiri dari JSONPath (string) dan nilai (tipe nilai), dipisahkan koma.

    JSON

    Catatan
    • Jika lokasi yang ditentukan ada, sistem mengembalikan objek JSON yang akan dioperasikan.

    • Jika posisi yang ditentukan tidak ada, data ditambahkan ke objek JSON.

    json_insert('{"Address":["City","Xian","Number",1]}','$.ID',100) mengembalikan {"Address":["City","Xian","Number",1],"ID":100}.

    Sisipkan atau perbarui data di posisi tertentu dalam objek JSON

    json_set(json, kvPairs...)

    • json: string, objek JSON yang akan dimodifikasi

    • kvPairs...: data yang akan disisipkan atau diperbarui. Setiap pasangan terdiri dari JSONPath (string) dan nilai (tipe nilai), dipisahkan koma.

    tipe nilai

    Catatan
    • Jika posisi yang ditentukan ada, perbarui data.

    • Jika posisi yang ditentukan tidak ada, tambahkan data ke objek JSON.

    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 dalam objek JSON

    json_put(json, key, value)

    • json: string, objek JSON yang akan dimodifikasi

    • key: string, nama kunci yang akan disisipkan atau diperbarui

    • value: tipe nilai, nilai untuk kunci

    JSON

    Catatan
    • Jika json bukan objek JSON, mengembalikan null.

    • Jika kunci ada, perbarui nilainya.

    • Jika kunci tidak ada, tambahkan ke objek JSON.

    json_put('{"loginId":100}','loginTime','2024-10-10') mengembalikan {"loginId":100, "loginTime":"2024-10-10"}.

    Ganti data di posisi tertentu dalam objek JSON

    json_replace(json, kvPairs...)

    • json: string, objek JSON yang akan dimodifikasi

    • kvPairs...: data yang akan diganti. Setiap pasangan terdiri dari JSONPath (string) dan nilai (tipe nilai), dipisahkan koma.

    tipe nilai

    Catatan

    Jika posisi yang ditentukan tidak ada, mengembalikan objek JSON asli.

    json_replace('{"ID":1,"Address":["City","Xian","Number",1]}',"$.IP",100) mengembalikan {"ID":1,"Address":["City","Xian","Number",1]}.

    Periksa apakah data tertentu ada di posisi dalam objek JSON

    json_contains(json, jsonPath, item)

    • json: string, objek JSON yang akan diquery

    • jsonPath: string, posisi dalam objek JSON

    • item: tipe nilai, data yang dicari

    Boolean: true atau false

    json_contains('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID',1) mengembalikan true.

    Periksa apakah posisi tertentu ada dalam objek JSON.

    json_contains_path(json, jsonPath)

    • json: string, objek JSON yang akan diquery

    • jsonPath: string, posisi yang akan diperiksa

    Boolean: true atau false

    json_contains_path('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID') mengembalikan true.

    Ambil data dari posisi tertentu dalam objek JSON

    json_extract(json, jsonPath)

    • json: string, objek JSON yang akan diquery

    • jsonPath: string, posisi dalam objek JSON

    tipe nilai

    json_extract('{"ID":1,"Address":["City","Xian","Number",1]}','$.ID') mengembalikan 1.

    Ambil nilai kunci tertentu dalam objek JSON

    json_get(json, key)

    • json: string, objek JSON yang akan diquery

    • key: string, nama kunci

    tipe nilai

    json_get('{"ID":1,"Address":["City","Xian","Number",1]}','ID') mengembalikan 1.

    Ambil semua kunci di posisi tertentu dalam objek JSON

    json_keys(json, jsonPath)

    • json: string, objek JSON yang akan diquery

    • jsonPath: string, posisi dalam objek JSON

    Array JSON

    json_keys('{"ID":1,"Address":["City","Xian","Number",1]}','$') mengembalikan ["ID","Address"].

    Ambil panjang (jumlah kunci) di posisi tertentu dalam objek JSON

    json_length(json, jsonPath)

    • json: string, objek JSON yang akan diquery

    • jsonPath: string, posisi dalam objek JSON

      Catatan

      Jika jsonPath adalah "$", setara dengan json_length(json).

    Integer

    json_length('{"ID":1,"Address":["City","Xian","Number",1]}','$') mengembalikan 2.

    Ambil panjang (jumlah kunci) di root objek JSON

    json_length(json)

    json: string, objek JSON yang akan diquery

    Integer

    json_length('{"ID":1,"Address":["City","Xian","Number",1]}') mengembalikan 2.

    Parsing string JSON menjadi objek JSON

    json_parse(json)

    json: string, string JSON yang akan diparsing

    tipe nilai

    json_parse('{"ID":1,"Address":["City","Xian","Number",1]}') mengembalikan {"ID":1,"Address":["City","Xian","Number",1]}.

    Hapus data dari posisi tertentu dalam objek JSON

    json_remove(json, jsonPath)

    • json: string, objek JSON yang akan dimodifikasi

    • jsonPath: string, posisi dalam objek JSON

    JSON

    json_remove('{"loginId":100, "loginTime":"2024-10-10"}','$.loginTime') mengembalikan {"loginId":100}.

Fungsi global

  • Fungsi kontrol aliran

    Function

    Syntax

    Parameters

    Example

    if statement

    e_if(bool_expr, func_invoke)

    • bool_expr: konstanta boolean atau pemanggilan fungsi. Konstanta: true atau false. Contoh pemanggilan fungsi: op_gt(`id`, 10).

    • func_invoke: pemanggilan fungsi. Didukung: e_drop, e_keep, e_set, e_if, e_compose

    e_if(op_gt(`id`, 10), e_drop()); menghapus catatan jika ID > 10.

    if-else statement

    e_if_else(bool_expr, func_invoke1, func_invoke2)

    • bool_expr: konstanta boolean atau pemanggilan fungsi. Konstanta: true atau false. Contoh pemanggilan fungsi: op_gt(`id`, 10).

    • func_invoke1: pemanggilan fungsi yang dieksekusi jika kondisi true.

    • func_invoke2: pemanggilan fungsi yang dieksekusi jika kondisi false.

    e_if_else(op_gt(`id`, 10), e_set(`tag`, 'large'), e_set(`tag`, 'small')); mengatur tag ke "large" jika ID > 10, jika tidak ke "small".

    Pernyataan mirip switch yang mengevaluasi beberapa kondisi dan mengeksekusi operasi pertama yang cocok. Mengeksekusi operasi default jika tidak ada kondisi yang cocok.

    s_switch(condition1, func1, condition2, func2, ..., default=default_func)

    • condition1: konstanta boolean atau pemanggilan fungsi. Konstanta: true atau false. Contoh pemanggilan fungsi: op_gt(`id`, 10).

    • func_invoke: pemanggilan fungsi. Memeriksa condition1; jika true, eksekusi fungsi ini dan keluar dari switch. Jika false, periksa kondisi berikutnya.

    • default_func: pemanggilan fungsi yang dieksekusi jika semua kondisi 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')).

    Gabungkan beberapa operasi

    e_compose(func1, func2, func3, ...)

    • func1: pemanggilan fungsi. Dapat berupa e_set, e_drop, e_if.

    • func2: pemanggilan fungsi. Dapat berupa e_set, e_drop, e_if.

    e_compose(e_set(`str_col`, 'test'), e_set(`dt_col`, dt_now())); mengatur str_col ke "test" dan dt_col ke waktu saat ini.

  • Fungsi manipulasi data

    Function

    Syntax

    Parameters

    Example

    Drop this record (do not synchronize)

    e_drop()

    None

    e_if(op_gt(`id`, 10), e_drop()); menghapus catatan di mana ID > 10.

    Keep this record (synchronize to destination)

    e_keep(condition)

    condition: ekspresi boolean

    e_keep(op_gt(id, 1)); hanya menyinkronkan catatan di mana ID > 1.

    Set column value

    e_set(`col`, val, NEW)

    • col: nama kolom

    • val: konstanta atau pemanggilan fungsi. Harus sesuai dengan tipe data col.

    • NEW: mengonversi col ke tipe data val (opsional)

      Penting

      Jika Anda menghilangkan NEW, jangan sertakan koma sebelumnya. Pastikan kompatibilitas tipe data untuk menghindari error tugas.

    • e_set(`dt_col`, dt_now()); mengatur dt_col ke waktu saat ini.

    • e_set(`col1`, `col2` + 1); mengatur col1 ke col2 + 1.

    • e_set(`col1`, 1, NEW); mengonversi col1 ke tipe numerik dan mengaturnya ke 1.

    Retensi bidang MongoDB, penghapusan bidang, dan pemetaan nama bidang

    e_expand_bson_value('*', 'fieldA',{"fieldB":"fieldC"})

    • *: nama bidang yang akan dipertahankan; * berarti semua bidang.

    • fieldA: nama bidang yang akan dihapus.

    • {"fieldB":"fieldC"}: pemetaan nama bidang; fieldB adalah nama bidang sumber, fieldC adalah nama bidang tujuan.

      Catatan

      Pemetaan nama bidang opsional.

    e_expand_bson_value("*", "_id,name"); menulis semua bidang kecuali _id dan name ke tujuan.