You need to enable JavaScript to run this app.
文档中心
飞连

飞连

复制全文
下载 pdf
配置同步策略
配置数据源映射策略
复制全文
下载 pdf
配置数据源映射策略

管理员在同步第三方数据源时,需要配置员工同步映射策略,映射策略分为字段映射和表达式映射两种,本文将介绍这两种映射策略,并重点介绍表达式映射策略如何配置。

功能介绍

管理员在管理后台的身份 > 账号配置 > 数据源同步功能页添加数据源时,需要配置第三方数据源和飞连内字段的映射关系,用于企业自主指定选择需要同步的数据。
Image
配置时映射规则支持字段映射和表达式映射,介绍如下:

映射规则

介绍

字段映射

在同步数据源时,飞连会获取第三方数据源的组织架构字段信息,通过字段映射,可以将第三方字段与飞连字段映射一起,在同步数据时,即可将指定的数据传输到飞连内。例如,将第三方字段员工 ID(user_id)与飞连字段员工 ID(user_id)绑定字段映射关系,在同步数据后,员工在飞连内的 ID 与原第三方平台内的 ID 一致,不会发生变化。

说明

  • 添加数据源时,上游同步和下游同步均支持字段映射。
  • 第三方字段支持添加扩展字段,详情参见配置扩展字段。

表达式映射

表达式映射用于动态生成第三方字段值,并映射到指定的飞连字段内。通过表达式和第三方字段的灵活组合,您可以获取到各种各样的数据。

  • 表达式:飞连内已支持的表达式语法说明参见下文表达式语法。
  • 第三方字段:指上游第三方数据源传入飞连的字段,字段信息您可以在指定数据源详情页的高级配置页签内,单击测试查看。
    Image

说明

  • 添加数据源时,仅上游同步支持表达式映射。
  • 一个表达式中可以配置一到多个第三方字段,也可以不配置第三方字段只配置表达式。

表达式示例用法:
在上游数据源同步到飞连时,需要将员工的旧邮箱地址统一替换为新邮箱地址,新邮箱地址前缀统一使用员工ID(user_id),则可以在邮箱映射字段内将表达式编辑为 user_id + "@example.com",这样数据源同步后,在飞连内的员工邮箱均为工号开头的新邮箱,例如 123456@example.com。

表达式语法

本章节汇总表达式支持的语法,您可以参考并编辑实际所需的表达式。

字面量

字面量(Literals)用于表示固定值,表达式语法中支持的字面量如下表所示。

字面量

说明

Comment

注释,用于备注表达式的逻辑等信息,格式为 /* */ 或者 //。

Boolean

布尔值,取值为 true、false。

Integer

整数。取值示例:

  • 二进制,例如0b101010
  • 八进制,例如0o52
  • 十进制,例如42
  • 十六进制,例如0x2A

Float

浮点数。例如 0.5(也可表达为.5)

String

字符串。例如 "foo"、'bar'

Array

数组。例如 [1, 2, 3]

Map

键值对集合。例如 {a: 1, b: 2, c: 3}

Nil

零值,固定取值 nil。

运算符

表达式中支持的运算符说明如下表所示。

运算符

说明

算术运算符

  • +:加
  • -:减
  • *:乘
  • /:除
  • %:取模
  • ^或者**:幂运算

比较运算符

  • ==:等于
  • !=:不等于
  • <:小于
  • >:大于
  • <=:小于等于
  • >=:大于等于

逻辑运算符

  • not or !:非运算
  • and or &&:与运算
  • or or ||:或运算

条件运算符

  • ?::三元运算符。格式示例condition ? true : false,该示例中,condition是判断条件,满足条件则返回true,不满足条件则返回false。
  • ??:空合并运算符。格式示例value ?? default_value,该示例中,如果value非空或已定义则返回value,否则返回default_value。

成员运算符

包括[]、.、?.、in运算符。使用说明如下:

  • 表达式结构体的字段可以通过[]运算符或者.运算符访问,如下两个表达式作用一致。

    user.Name
    user["Name"]
    
  • 数组元素可以通过 [] 运算符访问。支持负索引, -1 表示获取数组最后一个元素。

    array [0] // 第一个元素
    array [-1] // 最后一个元素
    
  • in 运算符可以用于检查数组中是否包含某项。

    "John" in ["John", "Jane"]
    "name" in {"name": "John", "age": 30}
    
  • ?.运算符用于链式调用时判断字段是否为 nil,为 nil 则直接返回 nil。例如:

    author.User?.Name
    

    判断author.User是否为nil,不为nil则输出author.User.Name、为nil则输出nil。等价于:

    author.User != nil ? author.User.Name : nil
    
  • ?.运算符可以和??运算符结合使用,在取值为 nil 时返回指定值。例如:

    author.User?.Name ?? "Anonymous"
    

    判断author.User是否为nil,不为nil则输出author.User.Name、为nil则输出"Anonymous"。等价于:

    author.User != nil ? author.User.Name : "Anonymous"
    

字符串运算符

  • +:用于字符串拼接
  • contains:用于检查一个字符串中是否包含指定的子字符串,返回布尔值。
  • startsWith:用于检查一个字符串是否以指定子字符串开始,返回布尔值。
  • endsWith:用于检查一个字符串是否以指定子字符串结尾,返回布尔值。

正则运算符

matches

范围运算符

..:用于创建一个整数范围。例如:

1..3 == [1, 2, 3]

数组运算符

[start:end]:从数据组获取子数组,start 是起始索引(包含),end 是结束索引(不包含)。
例如,一个 [1, 2, 3, 4, 5] 数组。

array[1:3] == [2, 3]
array[1:-1] == [2, 3, 4]
array[:3] == [1, 2, 3]
array[3:] == [4, 5]
array[:] == array

管道运算符

|:将左侧表达式结果传递给右侧表达式的第一个参数。例如:

// 1. 将 user.Name 字段值传入 lower 函数。
// 2. 转换为全小写后,传入 split 函数,以空格为分隔符,拆分字符串。
user.Name

变量

表达式内可以使用 let 关键字声明变量,声明后可在当前表达式内使用变量。变量名必须以字母或者下划线()开头,变量名可以包含字母、数字或下划线()。例如:

let x = 42; x * 2

多个变量可以通过分号分隔。例如:

let x = 42; 
let y = 2; 
x * y

变量值可以是表达式,以配置管道运算符(|)为例,结合变量构建的表达式如下:

let name = user.Name | lower() | split(" "); 
"Hello, " + name[0] + "!"

谓语

filter(过滤), all(所有), any(任一), one(一个), none(无)等谓语可应用于表达式中。例如以下示例,创建一个 0 到 9 的数组,然后通过偶数判断来过滤该数组。

filter(0..9, {# % 2 == 0})

如果数组的项是 struct(结构体) 或者 map(映射),可以省略#访问字段。例如, *.Value可以写为.Value。

filter(tweets, {len(.Content) > 240})

其中大括号{}可以省略:

filter(tweets, len(.Content) > 240)

字符串函数

trim(str[,chars])

从字符串str的两端删除空格。chars参数为可选参数,用于设置要删除的字符集合。

trim("  Hello  ") == "Hello" // 删除空格
trim("__Hello__", "_") == "Hello" // 删除下划线(_)

trimPrefix(str, prefix)

如果字符串str以指定的前缀prefix开头,则删除该前缀。

trimPrefix("HelloWorld", "Hello") == "World" // 删除 Hello 前缀

trimSuffix(str, suffix)

如果字符串str以指定的后缀suffix结尾,则删除该后缀。

trimSuffix("HelloWorld", "World") == "Hello" // 删除 World 后缀

upper(str)

将字符串str中的所有字符转换为大写。

upper("hello") == "HELLO"

lower(str)

将字符串str中的所有字符转换为小写。

lower("HELLO") == "hello"

split(str, delimiter[, n])

在每个分隔符delimiter处拆分字符串str,并返回子字符串的数组。

split("apple,orange,grape", ",") == ["apple", "orange", "grape"]
split("apple,orange,grape", ",", 2) == ["apple", "orange,grape"]

splitAfter(str, delimiter[, n])

在每个分隔符delimiter之后拆分字符串str。

splitAfter("apple,orange,grape", ",") == ["apple,", "orange,", "grape"]
splitAfter("apple,orange,grape", ",", 2) == ["apple,", "orange,grape"]

replace(str, old, new)

将字符串str中的所有old替换为new。

replace("Hello World", "World", "Universe") == "Hello Universe"

repeat(str, n)

将字符串str重复n次。

repeat("Hi", 3) == "HiHiHi"

indexOf(str, substring)

返回字符串str中首次出现子字符串的索引,如果未找到则返回 -1。

indexOf("apple pie", "pie") == 6

lastIndexOf(str, substring)

返回字符串str中最后一次出现子字符串的索引,如果未找到则返回 -1。

lastIndexOf("apple pie apple", "apple") == 10

hasPrefix(str, prefix)

如果字符串str以给定的前缀prefix开头,则返回true。

hasPrefix("HelloWorld", "Hello") == true

hasSuffix(str, suffix)

如果字符串str以给定的后缀suffix结尾,则返回true。

hasSuffix("HelloWorld", "World") == true

日期函数

日期函数内置对 Go time 包的支持。可进行的操作说明:

  • 对两个日期进行减法,得到之间相差的时间。

    createdAt - now()
    
  • 可以在某一日期上添加指定时间,得到新的日期。

    createdAt + duration("1h")
    
  • 支持多个日期之间的比较。

    createdAt > now() - duration("1h")
    

now()

用于返回当前日期,对应 Go time.Time 函数。例如:

now().Year() == 2024

duration (str)

返回字符串str对应的时间转换结果,对应 Go time.Duration 函数。有效的时间单位:ns、us、ms、s、m、h

duration("1h").Seconds() == 3600

date(str[, format[, timezone]])

将字符串str转换为日期表示。

  • 如果提供了可选参数format,则表示需要使用指定日期格式,格式要求与 Go time 包一致。
  • 如果提供了可选参数timezone,则表示需要指定日期时区。
  • 如果没有提供format参数,则str必须是以下格式之一:
    • 2006-01-02
    • 15:04:05
    • 2006-01-02 15:04:05
    • RFC3339
    • RFC822,
    • RFC850,
    • RFC1123,

示例用法:

date("2023-08-14")
date("15:04:05")
date("2023-08-14T00:00:00Z")
date("2023-08-14 00:00:00", "2006-01-02 15:04:05", "Europe/Zurich")

date 可用的方法:

  • Year():返回年份
  • Month():返回月份(从 1 开始)
  • Day():返回月份中的日期
  • Hour():返回小时
  • Minute():返回分钟
  • Second():返回秒
  • Weekday():返回星期几
  • YearDay():返回年份中的第几天
  • 查看更多信息:time.Time

示例用法:

date("2023-08-14").Year() == 2023

timezone(str)

返回字符串str的时区。

timezone("Europe/Zurich")
timezone("UTC")

使用In()方法可以将日期转换为不同的时区。

date("2023-08-14 00:00:00").In(timezone("Europe/Zurich"))

数值函数

max(n1, n2)

返回n1、n2中的最大值。

max(5, 7) == 7

min(n1, n2)

返回n1、n2中的最小值。

min(5, 7) == 5

abs(n)

返回n的绝对值。

abs(-5) == 5

ceil(n)

返回大于或等于n的最小整数值。

ceil(1.5) == 2.0

floor(n)

返回小于或等于n的最大整数值。

floor(1.5) == 1.0

round(n)

返回n进行四舍五入后的整数。

round(1.5) == 2.0

数组函数

数组函数常与谓语关联使用,详情了解谓语。

all(array, predicate)

数组的所有元素满足谓语条件时,返回 true。数组为空也返回 true。

all(tweets, {.Size < 280})

any(array, predicate)

数组内至少有一个元素满足谓语条件时,返回 true。数组为空也返回 true。

any(tweets, {.Size > 280})

one(array, predicate)

数组内仅有一个元素满足谓语条件时,返回 true。数组为空也返回 true。

one(participants, {.Winner})

none(array, predicate)

数组内所有元素都不满足谓语条件时,返回 true。数组为空也返回 true。

none(tweets, {.Size > 280})

map(array, predicate)

对数组内的每个元素应用谓语条件,并返回新的数组。

map(tweets, {.Size})

filter(array, predicate)

通过谓语条件过滤数组元素,并返回新的数组。

filter(users, .Name startsWith "J")

find(array, predicate)

在数组中查找第一个满足谓语条件的元素。

find([1, 2, 3, 4], # > 2) == 3

findIndex(array, predicate)

在数组中查找第一个满足谓语条件的元素的索引。

findIndex([1, 2, 3, 4], # > 2) == 2

findLast(array, predicate)

在数组中查找最后一个满足谓语条件的元素。

findLast([1, 2, 3, 4], # > 2) == 4

findLastIndex(array, predicate)

在数组中查找最后一个满足谓语条件的元素的索引。

findLastIndex([1, 2, 3, 4], # > 2) == 3

groupBy(array, predicate)

根据谓语条件对数组元素进行分组。

groupBy(users, .Age)

count(array[, predicate])

返回满足谓语条件的数组元素数量。

count(users, .Age > 18)

等价于:

len(filter(users, .Age > 18))

concat(array1, array2[, ...])

按顺序连接两个或多个数组。

concat([1, 2], [3, 4]) == [1, 2, 3, 4]

join(array[, delimiter])

将字符串数组内的元素用给定的分隔符连接成一个字符串。如果未提供分隔符,则直接连接字符串数组元素。

join(["apple", "orange", "grape"], ",") == "apple,orange,grape"
join(["apple", "orange", "grape"]) == "appleorangegrape"

reduce(array, predicate[, initialValue])

对数组内的每个元素应用谓语条件,将数组简化为单个值。可选参数initialValue用于指定累加器的初始值。如果没有提供initialValue参数值,则默认使用数组内的第一个元素作为初始值。
谓语条件(predicate参数)支持的变量:

  • #:表示当前元素
  • #acc:累加器
  • #index:当前元素的索引

示例用法:

reduce(1..9, #acc + #)
reduce(1..9, #acc + #, 0)

sum(array[, predicate])

返回数组中所有数字的和。

sum([1, 2, 3]) == 6

如果提供了可选的谓语条件(predicate参数),则先对每个元素应用谓语条件,再相加计算和。

sum(accounts, .Balance)

等价于:

reduce(accounts, #acc + .Balance, 0)
// or
sum(map(accounts, .Balance))

mean(array)

返回数组中所有数字的平均值。

mean([1, 2, 3]) == 2.0

median(array)

返回数组中所有数字的中位数。

median([1, 2, 3]) == 2.0

first(array)

返回数组中的第一个元素。如果数组为空,则返回nil。

first([1, 2, 3]) == 1

last(array)

返回数组中的最后一个元素。如果数组为空,则返回nil。

last([1, 2, 3]) == 3

take(array, n)

返回数组中的前 n 个元素。如果数组元素少于 n 个,则返回整个数组。

take([1, 2, 3, 4], 2) == [1, 2]

reverse(array)

将数组元素倒序排列。

reverse([3, 1, 4]) == [4, 1, 3]
reverse(reverse([3, 1, 4])) == [3, 1, 4]

sort(array[, order])

将数组元素升序排列。

sort([3, 1, 4]) == [1, 3, 4]
sort([3, 1, 4], "desc") == [4, 3, 1]

sortBy(array[, predicate, order])

根据谓语条件对数组元素排序。可选参数order用于指定排序的顺序:asc(升序)或desc(降序)。

sortBy(users, .Age)
sortBy(users, .Age, "desc")

Map 函数

keys(map)

返回 Map 键值对集合内所有的键。

keys({"name": "John", "age": 30}) == ["name", "age"]

values(map)

返回 Map 键值对集合内所有的值。

values({"name": "John", "age": 30}) == ["John", 30]

类型转换函数

type(v)

返回给定值v对应的数据类型。可能值有:

  • nil
  • bool
  • int
  • uint
  • float
  • string
  • array
  • map
  • 数据结构会返回类型名称

示例用法:

type(42) == "int"
type("hello") == "string"
type(now()) == "time.Time"

int(v)

返回数字或字符串的整数值。

int("123") == 123

float(v)

返回数字或字符串的浮点值。

float("123.45") == 123.45

string(v)

将给定值v转换为字符串。

string(123) == "123"

toJSON(v)

将给定值v转换为 JSON 字符串。

toJSON({"name": "John", "age": 30})

fromJSON(v)

解析给定的 JSON 字符串v,并返回相应的值。

fromJSON('{"name": "John", "age": 30}')

toBase64(v)

将字符串v编码为 Base64 格式。

toBase64("Hello World") == "SGVsbG8gV29ybGQ="

fromBase64(v)

将 Base64 编码的字符串v解码回其原始形式。

fromBase64("SGVsbG8gV29ybGQ=") == "Hello World"

toPairs(map)

将 Map 键值对集合转换为键值对数组。

toPairs({"name": "John", "age": 30}) == [["name", "John"], ["age", 30]]

fromPairs(array)

将键值对数组转换为 Map 键值对集合。

fromPairs([["name", "John"], ["age", 30]]) == {"name": "John", "age": 30}

其他函数

len(v)

返回数组、Map 集合或者字符串的长度。

len([1, 2, 3]) == 3
len({"name": "John", "age": 30}) == 2
len("Hello") == 5

get(v, index)

从数组、Map 集合中,检索指定索引的元素。

  • 如果索引超过数组、Map 集合的范围,则返回nil。
  • 如果 Map 集合的键不存在,则返回nil。
get([1, 2, 3], 1) == 2
get({"name": "John", "age": 30}, "name") == "John"

位运算函数

bitand(int, int)

返回位与操作的结果。

bitand(0b1010, 0b1100) == 0b1000

bitor(int, int)

返回位或操作的结果。

bitor(0b1010, 0b1100) == 0b1110

bitxor(int, int)

返回位异或操作的结果。

bitxor(0b1010, 0b1100) == 0b110

bitnand(int, int)

返回位与非操作的结果。

bitnand(0b1010, 0b1100) == 0b10

bitnot(int)

返回位非操作的结果。

bitnot(0b1010) == -0b1011

bitshl(int, int)

返回左移操作的结果。

bitshl(0b101101, 2) == 0b10110100

bitshr(int, int)

返回右移操作的结果。

bitshr(0b101101, 2) == 0b1011

bitushr(int, int)

返回无符号右移操作的结果。

bitushr(-0b101, 2) == 4611686018427387902
最近更新时间:2026.08.18 11:08:40
这个页面对您有帮助吗?
有用
有用
无用
无用