Node-RED全局上下文数组元素查询与新增问题求助
解决方案
问题根源
你使用的JSONata表达式存在两个核心问题:
- 上下文引用错误:JSONata默认上下文是
msg对象,无需用$.前缀访问payload属性,$.payload.agent_id会导致无法正确匹配目标属性值。 $exists用法不当:$exists()仅判断目标值是否为null或undefined,空数组属于“存在”的有效值,因此无论是否有匹配项,都无法得到你需要的布尔判断结果。
正确配置步骤
1. 修改Change节点(判断键值对是否存在)
- 操作类型选择
Set,目标字段设为msg.exists - 值类型选择
JSONata,输入以下表达式:
该表达式通过$count($globalContext('devices')[agent_id = payload.agent_id and device_id = payload.device_id]) > 0$count()统计数组中匹配的元素数量,数量大于0则返回true(表示键值对已存在),否则返回false。
2. Switch节点路由流程
- 选择根据
msg.exists判断分支 - 添加两个分支:
- 分支1:值为
true,直接输出(不执行添加操作) - 分支2:值为
false,连接到负责添加元素的Change节点
- 分支1:值为
3. 添加元素的Change节点
- 操作类型选择
Set,目标字段设为global.devices - 值类型选择
JSONata,输入以下表达式:
该表达式将当前消息的$append($globalContext('devices'), [payload])payload追加到全局devices数组中。
验证效果
当传入已存在的{agent_id, device_id}对时,msg.exists会返回true,跳过添加流程;传入新的键值对时,msg.exists返回false,自动将新元素追加到全局数组。
内容的提问来源于stack exchange,提问作者breakfastea
相关产品推荐
相关产品推荐

