在自动化工作流中,我们经常需要处理来自多个数据源的数据。Merge节点就是n8n中用来合并、组合这些数据的强大工具。无论是合并两个API的响应,还是将用户信息与订单数据关联,Merge节点都能帮你轻松解决。
Merge节点的核心功能是将来自不同数据流的数据合并成一个输出流。简单来说,它解决的是这样的问题:
Merge节点通常有两个输入(Input 1 和 Input 2),你可以把不同来源的数据接入这两个输入,然后选择合并方式。n8n 1.49.0版本后,还支持多达10个输入,让数据合并更灵活。
Merge节点提供了多种合并策略,每种都适合不同的场景。让我们逐个了解:
适用场景:你只是想把两个数据集连接在一起,不需要任何匹配或关联逻辑。
工作方式:
示例:
[{name: 'Alice'}, {name: 'Bob'}][{name: 'Charlie'}, {name: 'David'}][{name: 'Alice'}, {name: 'Bob'}, {name: 'Charlie'}, {name: 'David'}]这是Merge节点最强大的功能,提供多种子模式:
适用场景:你有一个共同的标识符(如ID、Email),需要将匹配的项目融合。
工作方式:
customer_id)匹配输出类型(决定输出哪些项目):
| 输出类型 | 说明 | SQL对标 | 场景 |
|---|---|---|---|
| Keep Matches | 只保留两边都有的项目 | INNER JOIN | 用户既有订单的数据 |
| Keep Non-Matches | 只保留两边都没有的项目 | 反向匹配 | 特殊业务逻辑 |
| Keep Everything | 保留所有项目,有匹配则关联 | OUTER JOIN | 完整数据视图 |
| Enrich Input 1 | 保留Input 1的所有,用Input 2数据补充 | LEFT JOIN | 用户信息 + 订单数据 |
| Enrich Input 2 | 保留Input 2的所有,用Input 1数据补充 | RIGHT JOIN | 订单数据 + 用户信息 |
实战例子:
Input 1 (客户表):
[
{ customer_id: '1', name: '张三' },
{ customer_id: '2', name: '李四' },
{ customer_id: '3', name: '王五' }
]
Input 2 (订单表):
[
{ customer_id: '1', order_id: 'ORD001', amount: '¥1000' },
{ customer_id: '2', order_id: 'ORD002', amount: '¥500' }
]
使用 Enrich Input 1(按customer_id匹配)的结果:
[
{
customer_id: '1',
name: '张三',
order_id: 'ORD001',
amount: '¥1000'
},
{
customer_id: '2',
name: '李四',
order_id: 'ORD002',
amount: '¥500'
},
{
customer_id: '3',
name: '王五'
// 没有订单数据
}
]适用场景:两个数据集在相同位置的项目是相关的(比如排序后的列表)。
工作方式:
示例:
Input 1: [{name: '张三'}, {name: '李四'}]
Input 2: [{score: 90}, {score: 85}]
Output:
[
{name: '张三', score: 90},
{name: '李四', score: 85}
]适用场景:你需要生成所有可能的组合方案(如A/B测试的广告组合、生成变体等)。
工作方式:
示例:
Input 1 (标题): [{title: 'A'}, {title: 'B'}, {title: 'C'}]
Input 2 (图片): [{img: '图1'}, {img: '图2'}]
Output: 6个组合
[
{title: 'A', img: '图1'},
{title: 'A', img: '图2'},
{title: 'B', img: '图1'},
{title: 'B', img: '图2'},
{title: 'C', img: '图1'},
{title: 'C', img: '图2'}
]适用场景:需要复杂的数据操作,简单的合并模式无法满足。
工作方式:
input1, input2, input3 等表来使用示例:
SELECT
i1.customer_id,
i1.name,
i2.order_id,
CASE
WHEN i2.amount > 1000 THEN '大单'
ELSE '小单'
END as order_type
FROM input1 i1
LEFT JOIN input2 i2 ON i1.customer_id = i2.customer_id
WHERE i1.customer_id != '999'适用场景:需要基于条件选择使用哪个输入的数据。
工作方式:
这在流程控制中很有用,但不是真正的"合并"。
| 参数 | 说明 | 例子 |
|---|---|---|
| Mode(模式) | 选择合并方式:Append/Combine/SQL Query/Choose Branch | Combine |
| Combine By | 组合方式:Matching Fields/Position/All Combinations | Matching Fields |
| Fields to Match | 指定匹配的字段名 | Input 1: id, Input 2: user_id |
| Output Type | 输出类型(仅Matching Fields) | Keep Matches / Enrich Input 1 |
| Number of Inputs | 输入数量(1.49.0+支持2-10个) | 3 |
"3" 和 3 视为相同)在Merge节点之前,需要有两个(或多个)数据来源:
// 数据源1:Code节点或HTTP Request输出
// 客户信息
return [
{ json: { customer_id: '1', name: '张三' } },
{ json: { customer_id: '2', name: '李四' } }
];
// 数据源2:
// 订单信息
return [
{ json: { customer_id: '1', amount: '¥1000' } },
{ json: { customer_id: '2', amount: '¥500' } }
];在n8n编辑器中:
根据你的需求选择模式:
例1:按ID匹配客户和订单
Mode → Combine
Combine By → Matching Fields
Input 1 Field → customer_id
Input 2 Field → customer_id
Output Type → Enrich Input 1例2:简单追加两个数据集
Mode → Append
Number of Inputs → 2A: 检查匹配字段的值是否完全相同。n8n默认进行严格匹配,空值、大小写差异都会导致不匹配。
解决方案:
A: 取决于你选择的输出类型:
A: Merge节点按字段名匹配,不按含义匹配。如果Input 1用 id,Input 2用 user_id,需要在匹配配置中分别指定:
iduser_idA: 设置 Clash Handling:
language_1, language_2)以下是一个从头到尾的完整可执行工作流,包含客户信息和订单数据的合并:
[客户信息] ──┐
├──→ [Merge节点] ──→ [输出合并后的数据]
[订单信息] ──┘将以下代码复制到n8n中导入:
{
"name": "【n8n教程】 Merge合并数据示例",
"active": false,
"nodes": [
{
"parameters": {
"jsCode": "return [\n { json: { customer_id: '1', name: '张三' } },\n { json: { customer_id: '2', name: '李四' } },\n { json: { customer_id: '3', name: '王五' } }\n]"
},
"id": "客户信息",
"name": "客户信息",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [250, 300]
},
{
"parameters": {
"jsCode": "return [\n { json: { customer_id: '1', order_id: 'ORD001', order_amount: '¥1000', product: '笔记本' } },\n { json: { customer_id: '2', order_id: 'ORD002', order_amount: '¥500', product: '鼠标' } }\n]"
},
"id": "订单信息",
"name": "订单信息",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [250, 500]
},
{
"parameters": {
"mode": "combine",
"combineBy": "fields",
"fieldsToMatchOptions": {
"fields": [
{
"input1": "customer_id",
"input2": "customer_id"
}
]
},
"outputType": "enrichInput1"
},
"id": "Merge节点",
"name": "Merge节点",
"type": "n8n-nodes-base.merge",
"typeVersion": 1,
"position": [600, 400]
}
],
"connections": {
"客户信息": {
"main": [
[
{
"node": "Merge节点",
"type": "main",
"index": 0
}
]
]
},
"订单信息": {
"main": [
[
{
"node": "Merge节点",
"type": "main",
"index": 1
}
]
]
}
}
}执行这个工作流后,输出结果应该是:
[
{
"customer_id": "1",
"name": "张三",
"order_id": "ORD001",
"order_amount": "¥1000",
"product": "笔记本"
},
{
"customer_id": "2",
"name": "李四",
"order_id": "ORD002",
"order_amount": "¥500",
"product": "鼠标"
},
{
"customer_id": "3",
"name": "王五"
}
]说明:
Enrich Input 1,所以王五的数据也被保留了Input 1 (用户): [{ id: 1, username: 'admin' }, { id: 2, username: 'user' }]
Input 2 (权限): [{ user_id: 1, role: '管理员' }]
Mode: Combine → Matching Fields → Keep Matches
Result: [{ id: 1, username: 'admin', user_id: 1, role: '管理员' }]第1页数据: [item1, item2, item3]
第2页数据: [item4, item5, item6]
Mode: Append
Result: [item1, item2, item3, item4, item5, item6]文案集: [文案1, 文案2]
图片集: [图片1, 图片2, 图片3]
Mode: Combine → All Possible Combinations
Result: 6个组合 (2×3)[1] 官方文档: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#