首先完成“第 3 课:使用 SplitInBatches 循环遍历列表”即可解锁本课程。转到上一课

引言

在实际的 n8n 工作流中,你很少会遇到一条直线执行到底的情况。更常见的是将流程分叉:一个分支查询你的 CRM,另一个获取分析数据,第三个则等待来自客户的 webhook。在某个时刻,你需要把这些并行分支重新合并到一起——这正是 Merge 节点的用途。正确理解如何合并分支可以防止数据丢失、重复处理,以及那些只在生产环境中才会暴露的隐蔽 bug。

本课涵盖 n8n 中三种主要的合并策略:等待所有输入完成、通过匹配键进行合并(类似 SQL 的连接),以及追加(拼接)所有传入的条目。每种策略服务于不同目的,选错策略是构建复杂自动化时最常见的错误之一。

一张流程图,显示一个源节点拆分为三个并行分支,每个分支执行不同任务,然后三个分支共同汇入一个 Merge 节点,输出一条合并后的数据流

Merge 节点的工作原理

Merge 节点接收多个输入流(Input 1、Input 2,可选更多)并产生单一的输出流。它只有在每个已连接的输入都至少送达一个条目后才会执行,这意味着它会隐式地同步各个分支。这就是「等待」行为:无论某个分支完成得多快,Merge 节点都会暂停,直到最慢的分支到达。

你也可以在节点设置中添加超时。如果某个分支永远不完成,合并最终会停止等待,并丢弃数据或以已到达的内容继续执行。这对于某些外部 API 可能挂起的长时间运行工作流很重要。

按键合并(Join 行为)

这是最接近 SQL JOIN 的等价方式。你选择一个在两个输入流中都存在的字段(例如 `email` 或 `orderId`),节点会配对具有相同值的条目。默认情况下,未匹配的条目会被丢弃,但你可以配置模式使其表现为 LEFT JOIN(保留 Input 1 中未匹配的条目)或外连接。

结果是每个匹配产生一个条目,来自两个输入的字段被合并在一起。下拉选项包括:

Append(追加):按顺序将两个输入的所有条目连接成一个扁平列表,不进行配对。当两个分支产生独立的记录、之后只需统一处理时使用(例如,来自 Mailchimp 的所有联系人和来自 HubSpot 的所有联系人,排队等待后续统一去重)。

Merge By Key(按键合并):通过共享字段配对条目,类似于数据库连接。当一侧的每个条目与另一侧的某个条目逻辑对应时使用,例如将订单记录与其对应的支付记录进行匹配。

Wait(等待):最简单的模式——不做任何转换,只同步时序。输出条目按 Input 1 的顺序排列,Input 2 的条目按位置一对一附加。只有当你完全控制两个分支并明确知道顺序一致时才使用。

Mode 下拉框包含以下四个选项:Append、Merge By Key、Merge By Position 和 Wait。注意,「Merge By Position」是简单等待-配对行为的技术名称——它通过条目在输入数组中的索引进行配对,只有当两个分支具有相同数量且顺序一致的条目时才能正确工作。

实际示例:合并订单和支付数据

假设分支 1 从数据库中拉取订单,分支 2 从 Stripe 拉取支付状态。每个分支生成的条目都有一个 `orderId` 字段。你希望每个订单对应一条合并记录。

json
{
"node": "Merge",
"type": "n8n-nodes-base.merge",
"parameters": {
"mode": "mergeByKey",
"joinMode": "inner",
"propertyName1": "orderId",
"propertyName2": "orderId"
}
}

将 `joinMode` 设置为 `inner` 时,只有两个分支中都存在的订单才会出现在输出中。如果切换为 `left`,则尚无支付记录的订单仍会向下游流转,并标记为未匹配——这对于发现缺失的支付非常有用。

常见错误与陷阱

最常见的错误是在两个分支产生不同数量条目时使用「Merge By Position」。如果分支 1 返回 10 个订单,分支 2 只返回 7 条支付记录,那么其中 3 个订单条目要么与 `null` 支付数据配对,要么根据设置被静默丢弃。只要数量可能不同,就应该始终使用「Merge By Key」。

另一个陷阱:Merge 节点不会去重。如果分支 1 中同一个 email 出现两次,而分支 2 只出现一次,你可能会得到重复的连接行。去重必须在合并之前完成,或者通过单独的节点在之后处理。

最后,请记住 Merge 会等待每个已连接的输入。如果你忘记连接某个输入,节点将永远等待(或直到超时)。未连接的输入是生产环境中工作流挂起的常见原因。

小结

Merge 节点是任何多分支工作流的同步点。当你只是想堆叠独立列表时使用 Append;当两侧条目通过共享标识符相关联时使用 Merge By Key;仅当两个分支产生长度一致的匹配数组时才使用 Wait / Merge By Position。务必检查每个输入都已连接,选择与数据完整性需求匹配的连接模式,并将去重逻辑放在合并之外以避免意外。

一张对比图,并排展示三种合并模式:Append(两个列表堆叠)、Merge By Key(通过共享字段配对,带匹配箭头)、Merge By Position(按索引 1-1、2-2、3-3 配对)
课后练习

课程检查点

巩固所学知识,获取作业反馈。

0/7
01哪个 Merge 节点模式通过共享字段(如 `orderId`)将两个分支的条目进行配对?
02如果使用 Merge By Position,但分支 1 返回 10 个条目、分支 2 只返回 7 个,会发生什么?
03哪种 Merge 模式用于将两个独立的记录列表简单堆叠为一个合并列表,而不进行配对?
04为什么 n8n 工作流在使用 Merge 节点时可能无限挂起?
05在 Merge By Key 节点中,将 `joinMode` 设置为 `left` 会有什么效果?
06关于 Merge 节点,下列哪项陈述是正确的?
07你有一个分支 1 返回客户记录,分支 2 返回这些客户的最新支持工单。每个客户可能有零个、一个或多个工单,并且你希望每个客户都出现在输出中,即使没有工单。哪种设置是正确的?
已回答 · 0/7