产品定价 立即试用
社区版
入门 文档 指南 安装 架构 API 常见问题

copy key-value pairs

将指定的键值对从入站消息data复制到其metadata,或从metadata复制到data。

前置条件

若从消息 data 复制,其必须为有效JSON对象。若消息data不是JSON对象,节点将原样透传消息。

配置

字段说明

  • 从以下位置复制键值对 — 指定复制操作的方向。可为:
    • Message to metadata — 从消息 data 复制到 metadata
    • Metadata to message — 从 metadata 复制到消息 data
  • Keys — 要从源复制的键集合。支持Java正则表达式。 若配置的键模式在源中无匹配,则忽略。

JSON Schema

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "TbCopyKeysNodeConfiguration",
  "type": "object",
  "properties": {
    "copyFrom": {
      "type": "string",
      "description": "The source of the key-value pairs to copy. 'DATA' means message data, 'METADATA' means message metadata.",
      "enum": [
        "DATA",
        "METADATA"
      ]
    },
    "keys": {
      "type": "array",
      "description": "A set of keys to copy from the source. Java regular expressions are supported.",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "copyFrom",
    "keys"
  ],
  "additionalProperties": false
}

消息处理逻辑

  1. 节点检查配置的复制方向(Message to metadataMetadata to message)。
  2. 遍历源(消息data或metadata)中所有键值对。
  3. 对源中每个键,检查其是否匹配 Keys 配置中列出的任一模式。
  4. 若键匹配,将键值对复制到目标。
    • 若目标中已存在同名键,其值将被覆盖
    • 从消息 data 复制到 metadata 时,任何非文本值(如数字、布尔、JSON对象、数组)会被转换为字符串表示。
  5. 若至少复制一个键值对,创建包含更新后data或metadata的新消息,传递至下一节点。
  6. 若无键匹配或源为空,原始消息原样透传。
  7. 若发生意外错误,消息经 Failure 路由。

输出连接

  • Success
    • 处理正常完成(即使未复制任何键)时。
  • Failure
    • 处理过程中发生意外错误时。

示例

示例1 — 从消息data复制到metadata

入站消息

Data:

1
2
3
4
5
{
  "temperature": 25.4,
  "humidity": 62,
  "deviceName": "Sensor-A1"
}

Metadata:

1
2
3
{
  "ts": "1756280400000"
}

节点配置

1
2
3
4
5
6
7
{
  "copyFrom": "DATA",
  "keys": [
    "temperature",
    "humidity"
  ]
}

出站消息

Data:

1
2
3
4
5
{
  "temperature": 25.4,
  "humidity": 62,
  "deviceName": "Sensor-A1"
}

Metadata:

1
2
3
4
5
{
  "temperature": "25.4",
  "humidity": "62",
  "ts": "1756280400000"
}

输出连接: Success

说明: temperaturehumidity 的键值对从消息data复制到metadata。注意数值在metadata中会转换为字符串。


示例2 — 从metadata复制到消息data

入站消息

Data:

1
2
3
{
  "temp": 21.3
}

Metadata:

1
2
3
4
{
  "deviceType": "Thermostat",
  "location": "Floor 1"
}

节点配置

1
2
3
4
5
6
7
{
  "copyFrom": "METADATA",
  "keys": [
    "deviceType",
    "location"
  ]
}

出站消息

Data:

1
2
3
4
5
{
  "temp": 21.3,
  "deviceType": "Thermostat",
  "location": "Floor 1"
}

Metadata:

1
2
3
4
{
  "deviceType": "Thermostat",
  "location": "Floor 1"
}

输出连接: Success

说明: deviceTypelocation 的键值对从metadata复制到消息data。


示例3 — 使用Java正则表达式

入站消息

Data:

1
2
3
4
5
6
{
  "sensor_temp": 33.1,
  "sensor_humidity": 45,
  "battery_level": 98,
  "sensor_pressure": 1012
}

节点配置

1
2
3
4
5
6
{
  "copyFrom": "DATA",
  "keys": [
    "sensor_.*"
  ]
}

出站消息

Metadata:

1
2
3
4
5
{
  "sensor_temp": "33.1",
  "sensor_humidity": "45",
  "sensor_pressure": "1012"
}

输出连接: Success

说明: 正则表达式 sensor_.* 匹配 sensor_tempsensor_humiditysensor_pressure。这些键值对复制到metadata。battery_level 不匹配,未复制。


示例4 — 键覆盖

入站消息

Data:

1
2
3
{
  "temperature": 22.5
}

Metadata:

1
2
3
4
{
  "temperature": "18.0",
  "deviceType": "Thermostat"
}

节点配置

1
2
3
4
5
6
{
  "copyFrom": "DATA",
  "keys": [
    "temperature"
  ]
}

出站消息

Metadata:

1
2
3
4
{
  "temperature": "22.5",
  "deviceType": "Thermostat"
}

输出连接: Success

说明: 消息data中的 temperature 键复制到metadata,覆盖了原有的 temperature 值。


示例5 — 将JSON对象复制到metadata

入站消息

Data:

1
2
3
4
5
6
7
{
  "location": {
    "lat": 40.7128,
    "lon": -74.0060
  },
  "status": "active"
}

节点配置

1
2
3
4
5
6
{
  "copyFrom": "DATA",
  "keys": [
    "location"
  ]
}

出站消息

Metadata:

1
2
3
{
  "location": "{\"lat\":40.7128,\"lon\":-74.0060}"
}

输出连接: Success

说明:location 键从data复制到metadata时,其值(JSON对象)会被转换为字符串。