跳转至

合并和拆分数据#

在本章中,您将学习如何合并和拆分数据,以及在什么情况下执行这些操作可能会有用。

合并数据#

在某些情况下,您可能需要合并(组合)和处理来自不同源的数据。

合并数据可以包括:

  • 从多个源创建一个数据集。
  • 在多个系统之间同步数据。这可能包括删除重复数据或在一个系统中数据发生变化时更新另一个系统中的数据。

单向同步 vs. 双向同步

在单向同步中,数据在一个方向上同步。一个系统作为单一的真相源。当主系统中的信息发生变化时,它会自动在辅助系统中发生变化;但如果辅助系统中的信息发生变化,变化不会反映在主系统中。

在双向同步中,数据在两个方向上同步(在两个系统之间)。当两个系统中的任一个系统中的信息发生变化时,它也会在另一个系统中自动发生变化。

此博客教程解释了如何在两个 CRM 之间进行单向和双向数据同步。

在 n8n 中,您可以使用合并节点合并来自两个不同节点的数据,它提供了几种合并选项:

请注意,组合 > 按字段合并需要您输入要匹配的字段。这些字段应该在数据源之间包含相同的值,以便 n8n 可以正确地将数据匹配在一起。在合并节点中,它们被称为 Input 1 FieldInput 2 Field

Property Input fields in the Merge node
Property Input fields in the Merge node

点记法中的属性输入

如果您想要在合并节点参数 Input 1 FieldInput 2 Field 中引用嵌套值,您需要以点记法格式输入属性键(作为文本,而不是表达式)。

Note

您也可以在别名 Join 下找到合并节点。如果您熟悉 SQL 连接,这可能更加直观。

合并练习#

构建一个工作流,合并来自客户数据库节点和代码节点的数据。

  1. 添加一个合并节点,从客户数据库节点获取 Input 1,从代码节点获取 Input 2
  2. 客户数据库节点中,运行 获取所有人员 操作。
  3. 代码节点中,创建一个包含两个对象的数组,每个对象有三个属性:namelanguagecountry,其中属性 country 有两个子属性 codename
    • 使用客户数据库中两个角色的信息填写这些属性的值。
    • 例如,Jay Gatsby 的语言是英语,国家名称是美国。
  4. 合并节点中,尝试不同的合并选项。
Show me the solution

此练习的工作流如下所示:

Workflow exercise for merging data
Workflow exercise for merging data

如果您使用 保持匹配 选项合并数据,使用名称作为要匹配的输入字段,结果应如下所示(请注意,此示例仅包含 Jay Gatsby;您的可能看起来不同,具体取决于您选择的角色):

Output of Merge node with option to keep matches
Output of Merge node with option to keep matches

要检查节点的配置,您可以复制下面的 JSON 工作流代码并将其粘贴到您的编辑器 UI 中:

  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
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
{
"meta": {
	"templateCredsSetupCompleted": true,
	"instanceId": "cb484ba7b742928a2048bf8829668bed5b5ad9787579adea888f05980292a4a7"
},
"nodes": [
	{
	"parameters": {
		"mode": "combine",
		"mergeByFields": {
		"values": [
			{
			"field1": "name",
			"field2": "name"
			}
		]
		},
		"options": {}
	},
	"id": "578365f3-26dd-4fa6-9858-f0a5fdfc413b",
	"name": "Merge",
	"type": "n8n-nodes-base.merge",
	"typeVersion": 2.1,
	"position": [
		720,
		580
	]
	},
	{
	"parameters": {},
	"id": "71aa5aad-afdf-4f8a-bca0-34450eee8acc",
	"name": "When clicking \"Execute workflow\"",
	"type": "n8n-nodes-base.manualTrigger",
	"typeVersion": 1,
	"position": [
		260,
		560
	]
	},
	{
	"parameters": {
		"operation": "getAllPeople"
	},
	"id": "497174fe-3cab-4160-8103-78b44efd038d",
	"name": "Customer Datastore (n8n training)",
	"type": "n8n-nodes-base.n8nTrainingCustomerDatastore",
	"typeVersion": 1,
	"position": [
		500,
		460
	]
	},
	{
	"parameters": {
		"jsCode": "return [\n  {\n    'name': 'Jay Gatsby',\n    'language': 'English',\n    'country': {\n      'code': 'US',\n      'name': 'United States'\n    }\n    \n  }\n  \n];"
	},
	"id": "387e8a1e-e796-4f05-8e75-7ce25c786c5f",
	"name": "Code",
	"type": "n8n-nodes-base.code",
	"typeVersion": 2,
	"position": [
		500,
		720
	]
	}
],
"connections": {
	"When clicking \"Execute workflow\"": {
	"main": [
		[
		{
			"node": "Customer Datastore (n8n training)",
			"type": "main",
			"index": 0
		},
		{
			"node": "Code",
			"type": "main",
			"index": 0
		}
		]
	]
	},
	"Customer Datastore (n8n training)": {
	"main": [
		[
		{
			"node": "Merge",
			"type": "main",
			"index": 0
		}
		]
	]
	},
	"Code": {
	"main": [
		[
		{
			"node": "Merge",
			"type": "main",
			"index": 1
		}
		]
	]
	}
},
"pinData": {}
}

循环#

在某些情况下,您可能需要对数组的每个元素或每个数据项目执行相同的操作(例如向您通讯录中的每个联系人发送消息)。从技术的角度来说,您需要遍历数据(使用循环)。

n8n 通常会自动处理这种重复处理,因为节点会对每个项目运行一次,因此您不需要在工作流中构建循环。

然而,有一些节点和操作的例外需要您在工作流中构建循环。

在 n8n 工作流中创建循环,您需要将一个节点的输出连接到前一个节点的输入,并添加一个 If 节点来检查何时停止循环。

分批处理数据#

如果您需要处理大量的传入数据、多次执行代码节点或避免 API 速率限制,最好将数据分成批次(组)并处理这些批次。

对于这些过程,请使用 逐项目循环节点。此节点将输入数据分成指定的批次大小,并在每次迭代中返回预定义数量的数据。

逐项目循环节点的执行

逐项目循环节点在所有传入项目被分成批次并传递给工作流中的下一个节点后停止执行,因此无需添加 If 节点来停止循环。

循环/批量练习#

构建一个工作流,读取来自 Medium 和 dev.to 的 RSS 源。工作流应由三个节点组成:

  1. 一个代码节点,返回 Medium(https://medium.com/feed/n8n-io)和 dev.to(https://dev.to/feed/n8n)的 RSS 源 URL。
  2. 一个逐项目循环节点,设置 Batch Size: 1,它接收来自代码节点RSS 读取节点的输入并遍历项目。
  3. 一个 RSS 读取节点,获取 Medium RSS 源的 URL,作为表达式传递:{{ $json.url }}
    • RSS 读取节点例外节点之一,它仅处理它收到的第一个项目,因此需要逐项目循环节点来遍历多个项目。
Show me the solution
  1. 添加一个代码节点。您可以以几种方式格式化代码,一种方式是:
    • 模式设置为 Run Once for All Items
    • 语言设置为 JavaScript
    • 复制下面的代码并将其粘贴到 JavaScript 代码编辑器中:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      let urls = [
      	{
      		json: {
      		url: 'https://medium.com/feed/n8n-io'
      		}
      	},
      	{
      	json: {
      		url: 'https://dev.to/feed/n8n'
      		} 
      	}
      ]
      return urls;
      
  2. 添加连接到代码节点逐项目循环节点
    • 批次大小设置为 1
  3. 逐项目循环节点会自动添加一个名为 "替换我" 的节点。将该节点替换为 RSS 读取节点
    • URL 设置为使用来自代码节点的 url:{{ $json.url }}

此练习的工作流如下所示:

Workflow for getting RSS feeds from two blogs
Workflow for getting RSS feeds from two blogs

要检查节点的配置,您可以复制下面的 JSON 工作流代码并将其粘贴到您的编辑器 UI 中:

  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
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
{
"meta": {
	"templateCredsSetupCompleted": true,
	"instanceId": "cb484ba7b742928a2048bf8829668bed5b5ad9787579adea888f05980292a4a7"
},
"nodes": [
	{
	"parameters": {},
	"id": "ed8dc090-ae8c-4db6-a93b-0fa873015c25",
	"name": "When clicking \"Execute workflow\"",
	"type": "n8n-nodes-base.manualTrigger",
	"typeVersion": 1,
	"position": [
		460,
		460
	]
	},
	{
	"parameters": {
		"jsCode": "let urls = [\n  {\n    json: {\n      url: 'https://medium.com/feed/n8n-io'\n    }\n  },\n  {\n   json: {\n     url: 'https://dev.to/feed/n8n'\n   } \n  }\n]\n\nreturn urls;"
	},
	"id": "1df2a9bf-f970-4e04-b906-92dbbc9e8d3a",
	"name": "Code",
	"type": "n8n-nodes-base.code",
	"typeVersion": 2,
	"position": [
		680,
		460
	]
	},
	{
	"parameters": {
		"options": {}
	},
	"id": "3cce249a-0eab-42e2-90e3-dbdf3684e012",
	"name": "Loop Over Items",
	"type": "n8n-nodes-base.splitInBatches",
	"typeVersion": 3,
	"position": [
		900,
		460
	]
	},
	{
	"parameters": {
		"url": "={{ $json.url }}",
		"options": {}
	},
	"id": "50e1c1dc-9a5d-42d3-b7c0-accc31636aa6",
	"name": "RSS Read",
	"type": "n8n-nodes-base.rssFeedRead",
	"typeVersion": 1,
	"position": [
		1120,
		460
	]
	}
],
"connections": {
	"When clicking \"Execute workflow\"": {
	"main": [
		[
		{
			"node": "Code",
			"type": "main",
			"index": 0
		}
		]
	]
	},
	"Code": {
	"main": [
		[
		{
			"node": "Loop Over Items",
			"type": "main",
			"index": 0
		}
		]
	]
	},
	"Loop Over Items": {
	"main": [
		null,
		[
		{
			"node": "RSS Read",
			"type": "main",
			"index": 0
		}
		]
	]
	},
	"RSS Read": {
	"main": [
		[
		{
			"node": "Loop Over Items",
			"type": "main",
			"index": 0
		}
		]
	]
	}
},
"pinData": {}
}
此页面是否
💬 微信

🚀 与作者交流

关注公众号
n8n实战笔记公众号
n8n实战笔记
📚 教程 💡 案例 🔧 技巧
添加微信
添加作者微信
1对1 专业指导
⚡ 快答 🎯 定制 🚀 支持