【n8n教程】:Remove Duplicates节点,清洁重复数据

📌 什么是Remove Duplicates节点?

Remove Duplicates(删除重复项)是n8n中的一个核心节点,用于识别和删除重复数据。它特别适用于以下场景:

  • 🔴 用户创建了多个账户
  • 🔴 客户多次提交相同订单
  • 🔴 API返回的数据包含重复项
  • 🔴 合并多个数据源导致重复记录
  • 🔴 需要跟踪历次执行中已处理的数据

该节点支持三种操作模式,可以处理单次执行内的重复项,也可以对比历次执行的数据。


点击获取最新AI资讯、n8n工作流、开发经验分享

🎯 三大操作模式

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次):

idemailnamesignup_date
1user1@example.comAlice2024-09-20T10:00:00.000Z
2user2@example.comBob2024-09-21T10:00:00.000Z
4user3@example.comCharlie2024-09-22T10:00:00.000Z

✅ 结果:从5条减少到3条,成功去重!


🎓 快速上手步骤

Step 1:添加节点

  1. 在画布上添加 Manual Trigger(手动触发)
  2. 添加 Code 节点生成测试数据
  3. 添加 Split Out 节点(如果是数组需要分离)
  4. 添加 Remove Duplicates 节点

Step 2:配置Remove Duplicates

  1. 打开节点设置
  2. 选择 Operation:选择 Remove Items Repeated Within Current Input
  3. 选择 Compare:选择 Selected Fields
  4. 输入 Fields To Compare:email 或你要去重的字段

Step 3:运行测试

  1. 点击 Execute Workflow
  2. 查看输出结果
  3. 调整参数直到满足需求

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节点

对于需要同时处理当前执行和历史执行的重复,可以:

  1. 第一个Remove Duplicates:Remove Items Repeated Within Current Input
  2. 第二个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

掌握这个节点,你就能构建更加健壮、干净、高效的自动化工作流!🎉


更多推荐