合并#
使用Merge节点合并来自多个流的数据,一旦所有流的数据都可用。
0.194.0版本的主要变更
n8n团队在n8n 0.194.0版本中全面改进了该节点。本文档反映的是该节点的最新版本。如果您使用的是旧版n8n,可以点击此处查看本文档的旧版内容。
1.49.0版本中的小改动
n8n 1.49.0版本引入了支持添加两个以上输入的功能。旧版本仅支持最多两个输入。如果您使用的是旧版本并希望在这些版本中合并多个输入,请使用Code节点。
模式 > SQL查询 功能也在n8n 1.49.0版本中添加,旧版本不可用。
节点参数#
您可以通过选择模式来指定合并节点应如何组合来自不同数据流的数据:
追加#
保留所有输入的数据。选择一个输入数量来依次输出每个输入项。该节点会等待所有已连接输入的执行完成。
合并#
将两个输入的数据合并。在合并方式中选择一个选项,以确定您希望如何合并输入数据。
匹配字段#
按字段值比较项目。在匹配字段中输入您想要比较的字段。
n8n的默认行为是保留匹配项。您可以通过输出类型设置来更改此行为:
- 保留匹配项: 合并匹配的项目。这类似于内连接。
- 保留不匹配项: 合并不匹配的项目。
- 保留所有内容: 将匹配的项合并在一起,并包含不匹配的项。这类似于外连接。
- 丰富输入1: 保留输入1的所有数据,并添加输入2中的匹配数据。这类似于左连接。
- 丰富输入2: 保留输入2的所有数据,并添加来自输入1的匹配数据。这类似于右连接。
位置#
根据顺序合并项目。输入1中索引0的项目与输入2中索引0的项目合并,依此类推。
所有可能的组合#
输出所有可能的项目组合,同时合并同名字段。
组合模式选项#
通过模式 > 合并合并数据时,您可以设置以下选项:
- 冲突处理: 选择当数据流冲突或存在子字段时如何合并。详情请参阅冲突处理。
- 模糊比较: 比较字段时是否容忍类型差异(启用)或不(禁用,默认)。例如,启用此选项后,n8n会将
"3"和3视为相同。 - 禁用点符号表示法: 这将阻止在字段名中使用
parent.child的方式来访问子字段。 - Multiple Matches: Choose how n8n handles multiple matches when comparing data streams.
- 包含所有匹配项: 如果存在多个匹配项,则输出多个条目,每个匹配项对应一个条目。
- 仅包含首个匹配项: 保留每个匹配的第一个条目,并丢弃其余多个匹配项。
- 包含未配对项: 选择在按位置合并时保留还是丢弃未配对的项。默认行为是排除没有匹配的项。
冲突处理#
如果索引中的多个项具有相同名称的字段,就会发生冲突。例如,如果输入1和输入2中的所有项都有一个名为language的字段,这些字段就会冲突。默认情况下,n8n会优先处理输入2,这意味着如果language在输入2中有值,n8n在合并项时会使用该值。
您可以通过选择选项 > 冲突处理来更改此行为:
- 当字段值冲突时: 选择优先使用哪个输入,或选择始终在字段名称后添加输入编号以保留所有字段和值,并在字段名称后附加输入编号以显示其来源。
- Merging Nested Fields
- 深度合并: 合并项目中所有层级的属性,包括嵌套对象。当处理复杂的嵌套数据结构时,这非常有用,可以确保所有层级的嵌套属性都被合并。
- 浅层合并: 仅合并项目顶层的属性,不合并嵌套对象。当您处理扁平数据结构或只需合并顶层属性而无需考虑嵌套属性时,这非常有用。
SQL查询#
编写自定义SQL查询以合并数据。
示例:
1 | |
来自之前节点的数据可作为表格使用,您可以在SQL查询中根据它们的顺序以input1、input2、input3等形式引用这些数据。完整支持的SQL语句列表请参阅AlaSQL GitHub页面。
选择分支#
选择保留哪个输入。此选项始终等待直到两个输入的数据都可用。您可以选择输出:
- 输入1数据
- 输入2数据
- 单个空项目
该节点输出所选输入的数据,不做任何更改。
模板和示例#
合并数据项数量不均的数据流#
传入合并节点输入1的项目将优先处理。例如,如果合并节点在输入1中收到5个项目,在输入2中收到10个项目,则仅处理5个项目。输入2中剩余的5个项目不会被处理。
使用If和Merge节点进行分支执行#
0.236.0 及以下版本
n8n在1.0版本中移除了此执行行为。本节适用于使用v0(旧版)工作流执行顺序的工作流。默认情况下,这包括所有在1.0版本之前构建的工作流。您可以在工作流设置中更改执行顺序。
如果在包含If节点的工作流中添加Merge节点,可能会导致If节点的两个输出数据流同时执行。
一个数据流触发合并节点,然后该节点会去执行另一个数据流。
例如,在下面的截图中有一个包含编辑字段节点、条件判断节点和合并节点的工作流。标准条件判断节点的行为是执行一个数据流(在截图中为true输出)。然而由于合并节点的存在,即使条件判断节点没有向false数据流发送任何数据,两个数据流都会被执行。
动手尝试:分步示例#
创建一个包含示例输入数据的工作流,以试用Merge节点。
使用代码节点设置示例数据#
- 在画布上添加一个代码节点并将其连接到开始节点。
- 将以下JavaScript代码片段粘贴到JavaScript代码字段中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
return [ { json: { name: 'Stefan', language: 'de', } }, { json: { name: 'Jim', language: 'en', } }, { json: { name: 'Hans', language: 'de', } } ]; - 添加第二个代码节点,并将其连接到起始节点。
- 将以下JavaScript代码片段粘贴到JavaScript代码字段中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
return [ { json: { greeting: 'Hello', language: 'en', } }, { json: { greeting: 'Hallo', language: 'de', } } ];
尝试不同的合并模式#
添加合并节点。将第一个代码节点连接到输入1,第二个代码节点连接到输入2。运行工作流以将数据加载到合并节点中。
最终的工作流程应如下所示:
现在尝试在模式中选择不同选项,观察其对输出数据的影响。
追加#
选择模式 > 追加,然后选择测试步骤。
表格视图中的输出应如下所示:
| 名称 | 语言 | 问候语 |
|---|---|---|
| 斯特凡 | 德 | |
| 吉姆 | en | |
| 汉斯 | 德语 | |
| en | 你好 | |
| de | 你好 |
通过匹配字段合并#
你可以合并这两个数据输入,这样每个人都能获得对应语言的正确问候语。
- 选择 模式 > 合并。
- 选择 按合并 > 匹配字段。
- 在输入1字段和输入2字段中,都输入
language。这会告诉n8n通过匹配每个数据集中的language字段值来合并数据。 - 选择测试步骤。
表格视图中的输出应如下所示:
| 名称 | 语言 | 问候语 |
|---|---|---|
| Stefan | de | 你好 |
| 吉姆 | en | 你好 |
| 汉斯 | 德语 | 你好 |
按位置合并#
选择模式 > 合并,合并方式 > 位置,然后选择测试步骤。
表格视图中的输出应如下所示:
| 名称 | 语言 | 问候语 |
|---|---|---|
| Stefan | en | 你好 |
| 吉姆 | de | 你好 |
保留未配对项#
如果想保留所有项目,请选择添加选项 > 包含任何未配对项目,然后开启包含任何未配对项目。
表格视图中的输出应如下所示:
| 名称 | 语言 | 问候语 |
|---|---|---|
| Stefan | en | 你好 |
| 吉姆 | de | 你好 |
| 汉斯 | 德语 |
按所有可能的组合合并#
选择模式 > 合并,合并方式 > 所有可能组合,然后选择测试步骤。
表格视图中的输出应如下所示:
| 名称 | 语言 | 问候语 |
|---|---|---|
| Stefan | en | 你好 |
| Stefan | de | 你好 |
| 吉姆 | en | 你好 |
| 吉姆 | de | 你好 |
| 汉斯 | en | 你好 |
| 汉斯 | 德语 | 你好 |
