n8n Filter节点:如何用表达式实现多条件嵌套过滤?

2026-02-22 9 0

还在用简单的 AND/OR?你可能浪费了 n8n 一半的算力

笔者在 N8N大学 社区里潜水时,发现一个很有趣的现象:很多同学用了 n8n 几个月,依然在 Filter 节点里只用最基础的“全部满足”或“任意满足”。

这就像开着法拉利去买菜——车是好车,但你只用了它 10% 的性能。

当你面对复杂的业务逻辑,比如“**只要(用户是 VIP 且 今天未打卡)或者(用户是新注册 且 余额大于 100)**”,简单的二元逻辑瞬间崩塌。这时候,你需要的不是堆砌多个 Filter 节点,而是学会使用**表达式(Expression)**来实现多条件嵌套过滤。

今天,我就带你用“大白话”拆解 n8n Filter 节点的底层逻辑,教你写出优雅且高效的过滤表达式。

理解 Filter 节点的两种模式

在 n8n 中,Filter 节点其实有两副面孔。搞清楚这两者的区别,是掌握高阶过滤的第一步。

1. 简单模式(Simple Mode)

这是新手最常用的模式。你通过下拉菜单选择“字段”、“运算符”和“值”。

  • 优点:直观,不需要写代码,适合简单的“与/或”逻辑。
  • 缺点:逻辑扁平。一旦你想做嵌套(比如 A AND (B OR C)),它就无能为力了。

2. 表达式模式(Expression Mode)

这是高手的游乐场。你直接编写 JavaScript 风格的布尔表达式。

  • 优点:无限灵活。支持嵌套逻辑、函数调用、正则匹配。
  • 缺点:需要一定的逻辑思维能力。

笔者建议:简单场景用简单模式,但凡涉及嵌套逻辑,请毫不犹豫切换到 Expression Mode

实战:如何编写嵌套过滤表达式

假设我们有一个电商场景的数据流。每一条数据包含:user_type (用户类型), last_login_days (距上次登录天数), order_amount (订单金额)。

业务需求:我们要筛选出“高价值用户”。标准是:
1. 既是 VIP 用户,且过去 7 天内登录过;
2. 或者,虽然是普通用户,但单笔订单金额超过 1000 元。

对应的逻辑公式为:
(user_type == "VIP" AND last_login_days 1000)

步骤一:切换到表达式模式

在 n8n 编辑器中,拖入 Filter 节点。点击节点,将模式从 "Simple" 切换为 "Expression"。

步骤二:编写核心逻辑

在表达式输入框中,我们需要利用 n8n 的上下文对象。n8n 默认使用 {{ $json.字段名 }} 来引用数据。

将上述公式转换为 n8n 表达式:

({{ $json.user_type }} == "VIP" && {{ $json.last_login_days }}  1000)

语法解析

  • ==:等于(注意是两个等号)。
  • &&:逻辑与(AND)。
  • ||:逻辑或(OR)。
  • {{ $json.字段名 }}:获取当前数据项的字段值。

步骤三:处理空值与异常(进阶)

实战中,数据往往不完美。如果 order_amount 字段不存在怎么办?直接相减会报错导致流程中断。

更稳健的写法是使用 get() 方法:

({{ $json.get('user_type') }} == "VIP" && {{ $json.get('last_login_days') }}  1000)

注意get('order_amount', 0) 的意思是:如果字段不存在,默认返回 0,避免计算错误。

常见误区与避坑指南

在 N8N大学 的过往教程中,我们反复强调:表达式虽好,但陷阱也不少。

坑点 1:数据类型的陷阱

n8n 接收到的数据可能是字符串(String)或数字(Number)。如果你的字段是字符串形式的数字(例如 "1000"),直接使用 > 比较可能会出现非预期的字典序比较。

解决方案:在比较前强制转换类型。

Number({{ $json.order_amount }}) > 1000

坑点 2:括号的优先级

JavaScript 的运算优先级中,&& 的优先级高于 ||。如果你写成 A || B && C,它会被解析为 A || (B && C)

解决方案:哪怕逻辑很简单,只要涉及 AND 和 OR 混用,**务必加上括号**来明确优先级。

坑点 3:空字符串的判断

如果你想判断字段是否存在且不为空,不要只写 {{ $json.field }}。因为在 n8n 表达式中,空字符串也会被判定为真(Truthy)。

正确写法

{{ $json.field && $json.field.length > 0 }}

FAQ 问答

Q1: Filter 节点报错 "Cannot read properties of undefined" 怎么办?

这通常是因为你引用了一个不存在的字段。比如数据里没有 age 字段,但你写了 {{ $json.age }}解决方案:使用 get() 方法并设置默认值,或者在表达式中先判断字段是否存在:$json.hasOwnProperty('age')

Q2: 如何在 Filter 中使用正则表达式?

完全可以。n8n 支持标准的 JS 正则。例如,筛选以 "n8n" 开头的邮件:

/^n8n/.test({{ $json.email }})

Q3: 表达式写得太复杂,如何调试?

建议使用 Set 节点。在 Filter 之前,用 Set 节点把你要判断的几个关键字段提取出来,运行一次看看实际值是什么。确认无误后,再把逻辑复制到 Filter 节点中。

总结与资源

Filter 节点的表达式模式,是 n8n 从“简单工具”进化为“商业逻辑引擎”的关键节点。掌握它,你就能处理 90% 以上的复杂数据清洗任务。

记住:先理清逻辑(纸笔画流程),再写表达式,最后处理异常。

想了解更多 n8n 的硬核技巧?欢迎访问 N8N大学 (n8ndx.com),这里有更多学长学姐的实战经验等你挖掘。

相关文章

n8n Wait节点在数据同步中的延迟控制实战
n8n Wait节点免费版:我能用它实现定时任务吗?
n8n Error Handling节点:当自动化流程“翻车”时,如何让它自动“扶起来”?
n8n Error Handling节点报错常见问题解决
当n8n流程意外中断,Error Handling节点如何配置才能优雅降级?
n8n Error Handling节点和Try/Catch节点,到底该怎么选?

发布评论