FILTER操作
FILTER操作将根据任意逻辑条件,限制返回的元素
语法
FILTER expression
表达式必须是一个条件,也就是说返回结果为false或true。
使用
如果条件结果为false,当前元素将被跳过,因此不会进一步处理,也不会成为结果的一部分。如果条件为true,当前元素不会被跳过,可以进一步处理。
可以在条件中使用的比较运算符、逻辑运算符等的列表,请参阅运算符
FOR u IN users
FILTER u.active == true && u.age < 39
RETURN u
可以在查询中使用多个FILTER语句,即使在同一个块中。如果使用多个FILTER语句,它们的结果将通过逻辑AND组合,这意味着所有过滤条件都必须为true,才能包含元素。
FOR u IN users
FILTER u.active == true
FILTER u.age < 39
RETURN u
在上例中,users中的所有元素active属性值为true并且age属性值小于39才会被包含在结果中,其他元素将被跳过。
有关不存在或null属性的影响的描述,请参阅访问集合中的数据
虽然FILTER通常与FOR结合使用,但它也可以在顶层使用,也可以在没有FOR循环的子查询中使用。
FILTER false
RETURN ASSERT(false, "never reached")
解释:
当FILTER子句的条件始终为假时,实际上不会执行到RETURN语句。因此,上述示例中的查询将不会有任何结果返回,并且由于FILTER之后没有满足条件的数据行,"ASSERT(false, "never reached")"这一部分也不会被执行。
执行顺序
请注意,FILTER语句的位置可能会影响查询的结果。例如,测试数据中有16个活动用户:
FOR u IN users
FILTER u.active == true
RETURN u
我们最多可以将结果集限制为5个用户:
FOR u IN users
FILTER u.active == true
LIMIT 5
RETURN u
这可能会返回Jim、Diego、Anthony、Michael和Chloe的用户文档。返回哪些是未定义的,因为没有SORT语句来确保特定的顺序。如果我们添加第二个FILTER语句,只返回女性…
FOR u IN users
FILTER u.active == true
LIMIT 5
FILTER u.gender == "f"
RETURN u
…它可能只是返回Chloe文档,因为LIMIT是在第二个FILTER之前应用的。到达第二个FILTER块的文档不超过5个,并且并非所有文档都符合性别标准,即使集合中有5个以上的活跃女性用户。可以通过添加SORT块来实现更具确定性的结果:
FOR u IN users
FILTER u.active == true
SORT u.age ASC
LIMIT 5
FILTER u.gender == "f"
RETURN u
这将返回用户Mariah、Mary和Isabella。如果按DESC顺序按年龄排序,则返回Sophia和Emma文档。但是,LIMIT后面的FILTER并不常见,您可能想要这样的查询:
FOR u IN users
FILTER u.active == true AND u.gender == "f"
SORT u.age ASC
LIMIT 5
RETURN u
FILTER关键字放置的位置具有重要意义,它可以同时承担SQL中的WHERE和HAVING两个关键字的角色。因此,无论是在处理COLLECT聚合函数生成的中间结果还是直接操作文档属性等任何情况下,AQL的FILTER都能够正常工作。