【n8n教程】:Remove Duplicates节点,清洁重复数据
【n8n教程】:Remove Duplicates节点,清洁重复数据
📌 什么是Remove Duplicates节点?
Remove Duplicates(删除重复项)是n8n中的一个核心节点,用于识别和删除重复数据。它特别适用于以下场景:
- 🔴 用户创建了多个账户
- 🔴 客户多次提交相同订单
- 🔴 API返回的数据包含重复项
- 🔴 合并多个数据源导致重复记录
- 🔴 需要跟踪历次执行中已处理的数据
该节点支持三种操作模式,可以处理单次执行内的重复项,也可以对比历次执行的数据。
🎯 三大操作模式
Remove Duplicates节点提供三种操作模式:
1️⃣ 移除当前输入中的重复项(最常用)
Remove Items Repeated Within Current Input
- 检查当前执行中的数据
- 对比所有字段或指定字段
- 删除完全相同的项目
适用场景:
- 上传的CSV文件中有重复行
- 从API获取的数据中有重复项
- 合并数据源时出现的重复
2️⃣ 移除历次执行中处理过的项目
Remove Items Processed in Previous Executions
- 对比当前数据与之前执行的历史数据
- 支持三种比较策略:
- Value Is New:删除曾经见过的项(去重)
- Value Is Higher than Any Previous Value:只保留更高的值
- Value Is a Date Later than Any Previous Date:只保留更新的日期
适用场景:
- RSS订阅去重
- 重复投递的通知过滤
- 定期数据同步时的增量处理
3️⃣ 清除重复数据历史
Clear Deduplication History
- 重置Remove Duplicates节点的内存
- 清空之前存储的对比数据
适用场景:
- 测试工作流时清除旧数据
- 重新开始去重流程
🔧 核心参数详解
模式一:移除当前输入中的重复项
参数:Compare(比较方式)
| 选项 | 说明 | 示例 |
|---|---|---|
| All Fields | 对比所有字段 | 所有字段都相同才算重复 |
| All Fields Except | 排除某些字段 | 排除ID字段后相同就算重复 |
| Selected Fields | 仅对比指定字段 | 只检查name和email字段 |
选项:Remove Other Fields(删除其他字段)
- 开启:删除所有未用于比较的字段
- 关闭:保留所有字段
使用场景:
✅ 开启:只关心去重字段,不需要其他信息
❌ 关闭:需要保留所有原始数据
模式二:移除历次执行的重复项
参数:Keep Items Where(保留策略)
Value Is New
条件:项目是新的(未在历史中出现过)
适用:邮箱/ID等唯一标识
输入:{{ $json.email }}
Value Is Higher than Any Previous Value
条件:当前值 > 历史最大值
适用:订单号、用户ID等递增值
输入:{{ $json.order_id }}
Value Is a Date Later than Any Previous Date
条件:当前日期 > 历史最新日期
适用:时间戳、更新时间
输入:{{ $json.last_updated }}
参数:Scope(作用域)
| 选项 | 说明 |
|---|---|
| Node | 去重数据仅作用于当前节点 |
| Workflow | 去重数据在整个工作流中共享 |
参数:History Size(历史大小)
- 默认:10,000条记录
- 可自定义:存储多少条历史记录用于对比
💡 实战案例:从邮件列表中去重
场景描述
你有一个订阅列表,用户可能多次提交,需要去除重复的邮箱地址。
工作流结构
Manual Trigger → Code(生成测试数据)→ Split Out →
Remove Duplicates(去重)→ Set(字段处理)→ Webhook
可执行工作流代码
{
"nodes": [
{
"parameters": {},
"id": "1a2b3c4d",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [250, 300]
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "let data = []; return { data: [\n { id: 1, email: 'user1@example.com', name: 'Alice', signup_date: '2024-09-20T10:00:00.000Z' },\n { id: 2, email: 'user2@example.com', name: 'Bob', signup_date: '2024-09-21T10:00:00.000Z' },\n { id: 3, email: 'user1@example.com', name: 'Alice', signup_date: '2024-09-20T10:00:00.000Z' },\n { id: 4, email: 'user3@example.com', name: 'Charlie', signup_date: '2024-09-22T10:00:00.000Z' },\n { id: 5, email: 'user2@example.com', name: 'Bob Smith', signup_date: '2024-09-21T11:00:00.000Z' }\n] }"
},
"id": "code-node-123",
"name": "Code - 生成测试数据",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [450, 300]
},
{
"parameters": {
"fieldToSplitOut": "data"
},
"id": "split-node-456",
"name": "Split Out - 分离数组",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [650, 300]
},
{
"parameters": {
"operation": "removeItemsRepeatedWithinCurrentInput",
"compare": "selectedFields",
"fieldsToCompare": ["email"],
"disableDotNotation": false,
"removeOtherFields": false
},
"id": "remove-dup-789",
"name": "Remove Duplicates - 按邮箱去重",
"type": "n8n-nodes-base.removeduplicates",
"typeVersion": 1,
"position": [850, 300]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "field1",
"name": "duplicate_status",
"value": "=unique"
}
]
}
},
"id": "set-node-101",
"name": "Set - 添加标记",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"position": [1050, 300]
}
],
"connections": {
"Manual Trigger": {
"main": [[{ "node": "Code - 生成测试数据", "branch": 0, "type": "main" }]]
},
"Code - 生成测试数据": {
"main": [[{ "node": "Split Out - 分离数组", "branch": 0, "type": "main" }]]
},
"Split Out - 分离数组": {
"main": [[{ "node": "Remove Duplicates - 按邮箱去重", "branch": 0, "type": "main" }]]
},
"Remove Duplicates - 按邮箱去重": {
"main": [[{ "node": "Set - 添加标记", "branch": 0, "type": "main" }]]
}
}
}
预期输出
输入了5条记录,其中有2条重复邮箱(user1@example.com和user2@example.com各重复1次):
| id | name | signup_date | |
|---|---|---|---|
| 1 | user1@example.com | Alice | 2024-09-20T10:00:00.000Z |
| 2 | user2@example.com | Bob | 2024-09-21T10:00:00.000Z |
| 4 | user3@example.com | Charlie | 2024-09-22T10:00:00.000Z |
✅ 结果:从5条减少到3条,成功去重!
🎓 快速上手步骤
Step 1:添加节点
- 在画布上添加 Manual Trigger(手动触发)
- 添加 Code 节点生成测试数据
- 添加 Split Out 节点(如果是数组需要分离)
- 添加 Remove Duplicates 节点
Step 2:配置Remove Duplicates
- 打开节点设置
- 选择 Operation:选择
Remove Items Repeated Within Current Input - 选择 Compare:选择
Selected Fields - 输入 Fields To Compare:
email或你要去重的字段
Step 3:运行测试
- 点击 Execute Workflow
- 查看输出结果
- 调整参数直到满足需求
Step 4:添加后续节点
连接到你需要的节点,如:
- Google Sheets(写入表格)
- HTTP Request(发送API请求)
- Email(发送通知)
⚠️ 常见坑点
坑1:嵌套字段的比较
❌ 错误:直接输入 user.email
✅ 正确:启用 Disable Dot Notation,然后输入 user.email
坑2:忘记Split Out
❌ 错误:数组数据直接连接到Remove Duplicates
✅ 正确:先用 Split Out 分离数组成单个项
坑3:历史数据持久化
❌ 错误:测试后忘记清除历史,导致第二次运行没有新数据
✅ 正确:使用 Clear Deduplication History 清空或选择合适的 Scope
坑4:混淆两种模式
❌ 错误:需要跨执行去重,却用了 Remove Items Repeated Within Current Input
✅ 正确:跨执行去重用 Remove Items Processed in Previous Executions
🚀 进阶技巧
组合去重字段
有时需要按多个字段组合去重:
Fields To Compare: email,name,company
这样只有email、name、company三个字段都完全相同才会被认为是重复。
使用表达式动态指定字段
{{ $json.userId }}_{{ $json.timestamp }}
组合多个字段值创建唯一标识。
连接多个Remove Duplicates节点
对于需要同时处理当前执行和历史执行的重复,可以:
- 第一个Remove Duplicates:
Remove Items Repeated Within Current Input - 第二个Remove Duplicates:
Remove Items Processed in Previous Executions
✨ 总结
Remove Duplicates是n8n中必不可少的数据清洁工具:
| 需求 | 使用模式 |
|---|---|
| 清理单次数据中的重复 | Remove Items Repeated Within Current Input |
| 防止跨执行的重复处理 | Remove Items Processed in Previous Executions |
| 重新开始去重过程 | Clear Deduplication History |
掌握这个节点,你就能构建更加健壮、干净、高效的自动化工作流!🎉
更多推荐


所有评论(0)