在日常数据处理中,我们经常需要对比两个数据集的差异——比如同步MySQL和企业微信的客户数据、对比新旧库存数据、或者查找重复的客户记录。n8n的Compare Datasets节点正是为此而生,它能帮你快速找出两个数据源中的相同项、不同项、以及各自独有的数据。本教程将带你从零开始,掌握这个强大的数据对比工具。

Compare Datasets节点的强大之处在于它能自动将两个数据集分成四个清晰的输出分支:
这种清晰的分类让后续的数据处理变得非常简单——你可以轻松地针对不同类型的数据采取不同的操作。
这是最关键的配置,你需要告诉节点用哪个字段来匹配两个数据集:
email、customerNumber)小贴士:你可以通过点击Add Fields to Match添加多个对比字段,实现复合键匹配。比如同时用年份和客户编号来匹配数据。
当节点发现数据有差异时,你需要决定保留哪个版本的数据:
| 选项 | 说明 | 适用场景 |
|---|---|---|
| Use Input A Version | 以输入A为准 | 单向数据同步,A是主数据源 |
| Use Input B Version | 以输入B为准 | 单向数据同步,B是主数据源 |
| Use a Mix of Versions | 混合使用两个版本 | 需要精细控制哪些字段用A,哪些用B |
| Include Both Versions | 同时保留A和B的版本 | 需要人工审核或对比的场景 |
Use a Mix of Versions详解:
开启后,节点会容忍类型差异,让对比更宽松:
3和字符串"3"被视为相同2023-01-01和2023/01/01)也会被识别为匹配建议:如果你的数据来源不同,格式可能不统一,建议开启此选项。
点击节点的Options可以进行更精细的配置:
有些字段你不关心它是否相同(比如更新时间戳),可以在这里输入字段名来忽略它们。
示例:如果你只关心person.language是否相同,不在乎person.name,就把person.name添加到这里。这样即使名字不同,只要语言相同,节点也会认为数据匹配。
默认情况下,你可以用parent.child的方式引用嵌套字段。如果你的字段名本身就包含点号,需要开启此选项。
当一个数据在另一个数据集中有多个匹配项时:
Compare Datasets节点的比较是两阶段过程:
这就是为什么同一条数据可能出现在Same Branch或Different Branch——关键在于除了匹配字段外,其他字段是否也完全相同。

让我们通过一个真实案例来学习如何使用Compare Datasets节点。这个工作流会自动同步MySQL数据库和企业微信的客户数据。
你的公司使用MySQL数据库管理客户档案,同时通过企业微信的销售易应用管理客户信息。你需要:
customer_id对应企业微信的userid,MySQL的name对应企业微信的name等步骤1:获取MySQL客户数据
添加MySQL节点,选择"Execute Query"操作,执行SQL查询获取客户数据:
SELECT customer_id, name, email, phone, address, update_time
FROM customers
WHERE update_time > NOW() - INTERVAL 1 DAY;这里我们只查询最近24小时更新的客户,避免一次处理过多数据。
步骤2:获取企业微信客户数据
添加企业微信节点,选择"Read members"操作(或相应的客户获取接口),获取所有客户信息:
配置凭证后,节点会返回企业微信中的所有成员/客户数据。
步骤3:标准化数据格式
在企业微信节点后添加一个Set节点,只保留需要对比的字段,并进行字段名转换,确保两个数据源的字段结构一致:
customer_id, name, email, phone, address, update_timeuserid, name, email, phone, department, update_timestamp在Set节点中配置字段映射:
{
"customer_id": $json.userid,
"name": $json.name,
"email": $json.email,
"phone": $json.phone,
"address": "", // 企业微信没有此字段,设置为空
"update_time": $json.update_timestamp
}记得开启Keep Only Set选项,这样只输出我们指定的字段。
步骤4:添加Compare Datasets节点
这是核心步骤:
email(MySQL中的邮箱字段)email(企业微信中的邮箱字段)步骤5:处理"仅在MySQL中"的数据
从In A only Branch输出连接到企业微信节点,操作选择"Create members"或相应的创建操作:
这会将MySQL中独有的客户自动创建到企业微信。配置字段映射,确保MySQL的字段正确对应到企业微信的字段格式。
步骤6:处理"仅在企业微信中"的数据
从In B only Branch输出连接到MySQL节点,操作选择"INSERT":
这会将企业微信中新增的客户自动添加到MySQL数据库。
配置INSERT语句:
INSERT INTO customers (customer_id, name, email, phone, update_time)
VALUES ($json.customer_id, $json.name, $json.email, $json.phone, NOW());步骤7:处理"不同"的数据
这是最复杂但也是最重要的部分——需要判断哪边的数据更新:
update_time:{{ new Date($json.different.input_a.update_time) > new Date($json.different.input_b.update_time) }}{
"name": $json.different.input_a.name,
"email": $json.different.input_a.email,
"phone": $json.different.input_a.phone
}UPDATE customers
SET name = '$json.different.input_b.name',
email = '$json.different.input_b.email',
phone = '$json.different.input_b.phone',
update_time = NOW()
WHERE customer_id = '$json.different.input_a.customer_id';步骤8:处理"相同"的数据
从Same Branch输出无需任何操作,因为两边已经一致了。但你可以添加一个webhook或通知节点来记录日志,用于后续审计。
运行这个工作流后,你会看到:
匹配字段必须是唯一标识符或稳定的业务字段:
email、phone(全局唯一,基本不变)customer_number、userid(系统主键)name(可能重复或变更)update_time(会频繁变化)如果数据量很大,建议:
在双向同步场景中要特别小心:
问题:如果A系统更新触发工作流同步到B系统,B系统更新又触发工作流同步回A系统,这会导致无限循环!
解决方案:
sync_flag字段,标记由工作流更新的记录为了追踪所有数据变更,可以:
原因:数据类型不匹配或格式不一致。比如MySQL的phone是整数13800000000,企业微信是字符串"+86 138-0000-0000"。
解决:
{{ String($json.phone) }}{{ $json.phone.replace(/\D/g, '') }}原因:除了匹配字段(email)外,其他字段有细微差异。比如MySQL的name是"张三",企业微信是"张三(销售部)",或者有多余空格。
解决:
department、remarks)原因:一次处理的数据太多,MySQL查询或企业微信API调用耗时过长。
解决:
LIMIT和WHERE条件,只获取需要同步的数据原因:企业微信有调用频率限制,短时间内大量API调用会被限流。
解决:
Compare Datasets节点是n8n中最强大的数据处理工具之一。掌握它的关键是理解:
通过本教程的学习和MySQL与企业微信实战案例,相信你已经能够运用Compare Datasets节点解决实际的数据对比和同步问题了。记住,多尝试、多实践,你会发现更多有趣的应用场景!
[1] 官方文档: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.comparedatasets/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#