如何在ArangoDB中不通过字符串拼接实现多字段非空过滤?
在ArangoDB中筛选指定字段均不为空的记录(无字符串拼接)
你的第一个查询无法正常工作的原因是:内层FOR c IN constraints循环会对每个满足x[c] != null的字段单独返回一次记录——哪怕有部分字段为空,只要有一个字段非空就会返回该记录多次,完全无法实现“所有指定字段均不为空”的筛选逻辑。
以下是两种更简洁高效的实现方案:
方案1:使用ALL()内置函数
ALL()是ArangoDB专门用来检查数组所有元素是否满足指定条件的函数,是这类场景的最优解:
LET constraints = ["size", "color", "model"] FOR x IN some_collection FILTER ALL(constraints, c => x[c] != null) RETURN x
这个查询会遍历集合中的每一条记录,仅当constraints数组里的所有字段在当前记录中都不为空时,才会返回该记录,逻辑直接且易读。
方案2:使用REDUCE()累积判断结果
通过REDUCE()函数逐步验证每个字段的非空状态,最终通过逻辑与的结果判断是否所有字段都满足条件:
LET constraints = ["size", "color", "model"] FOR x IN some_collection FILTER REDUCE(acc = true, c IN constraints RETURN acc && (x[c] != null)) RETURN x
REDUCE()初始值设为true,每遍历一个字段就将当前结果与该字段的非空判断做逻辑与——只要有一个字段为空,最终结果就会变为false,从而被FILTER排除。
这两种方案都比你的临时方法更高效:不需要生成中间数组再判断长度,直接在FILTER阶段完成所有校验,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者Sergius
相关产品推荐
相关产品推荐

