条件匹配
匹配文档
到目前为止,我们要么查找单个文档,要么返回整个字符集合。对于查找,我们使用了DOCUMENT()函数,这意味着我们只能通过它们的key或ID来查找文档。
为了实现更复杂的查询,AQL提供了FILTER操作,它使我们能够为文档制定任意条件来匹配。
平等条件
FOR c IN Characters
FILTER c.name == "Ned"
RETURN c
过滤条件如下所示:“ 字符文档的属性名称必须等于字符串Ned ”。如果条件适用,则返回字符文档。这适用于任何属性:
FOR c IN Characters
FILTER c.surname == "Stark"
RETURN c
范围条件
严格相等是我们可以说明的一个可能的条件。然而,我们可以制定许多其他条件。例如,我们可以要求所有年轻人:
FOR c IN Characters
FILTER c.age >= 13
RETURN c.name
[
"Joffrey",
"Tyrion",
"Samwell",
"Ned"]
13岁或13岁以上的每个Characters都被返回(在示例中只是他们的名字)。我们可以通过将运算符更改为小于等于,并使用对象语法来定义要返回的属性的子集,从而返回年龄小于13的所有Characters的名称和年龄 :
FOR c IN Characters
FILTER c.age < 13
RETURN { name: c.name, age: c.age }
[
{ "name": "Tommen", "age": null },
{ "name": "Arya", "age": 11 },
{ "name": "Roose", "age": null },
...
]
您可能会注意到它返回了30个Characters的名称和年龄,大多数年龄都是null。这是因为如果查询一个属性,但是这个属性在文档中又不存在,则会返回一个null值。并且NULL与数字比较低(参见类型和值顺序)。因此,符合年龄标准C.age<13(NULL<13)
多个条件
为了不让文档在没有年龄属性的情况下通过过滤器,我们可以添加第二个条件:
FOR c IN Characters
FILTER c.age < 13
FILTER c.age != null
RETURN { name: c.name, age: c.age }
[
{ "name": "Arya", "age": 11 },
{ "name": "Bran", "age": 10 }
]
这可以同样用布尔AND运算符编写,如下所示:
FOR c IN Characters
FILTER c.age < 13 AND c.age != null
RETURN { name: c.name, age: c.age }
第二个条件也可以c.age > null。
替代条件
如果您希望文档满足一个或另一个条件,也可能针对不同的属性,请使用OR:
FOR c IN Characters
FILTER c.name == "Jon" OR c.name == "Joffrey"
RETURN { name: c.name, surname: c.surname }
[
{ "name": "Joffrey", "surname": "Baratheon" },
{ "name": "Jon", "surname": "Snow" }
]
排序和限制
限制结果数量
某些情况下,我们并不需要返回所有的数据。在这些情况下,我们可以通过LIMIT()操作限制文档数量:
FOR c IN Characters
LIMIT 5
RETURN c.name
[
"Joffrey",
"Tommen",
"Tyrion",
"Roose",
"Tywin"
]
LIMIT后面跟着一个最大文档数的数字。还有第二种语法,它允许您跳过一定数量的记录并返回下一个n文档:
FOR c IN Characters
LIMIT 2, 5
RETURN c.name
[
"Tyrion",
"Roose",
"Tywin",
"Samwell",
"Melisandre"
]
看看第二个查询是如何跳过前两个名字并返回下一个五个(两个结果都是Tyron,RoSE和Tywin)。
按名称分类
查询返回的匹配记录的顺序基本上是随机的。要按照定义的顺序返回它们,我们可以添加一个 SORT()操作。
FOR c IN Characters
SORT c.name
LIMIT 10
RETURN c.name
[
"Arya",
"Bran",
"Brienne",
"Bronn",
"Catelyn",
"Cersei",
"Daario",
"Daenerys",
"Davos",
"Ellaria"
]
我们可以按照DESC降序反转排序顺序:
FOR c IN Characters
SORT c.name DESC
LIMIT 10
RETURN c.name
[
"Ygritte",
"Viserys",
"Varys",
"Tywin",
"Tyrion",
"Tormund",
"Tommen",
"Theon",
"The High Sparrow",
"Talisa"
]
第一种是升序,这是默认的顺序。因为它是默认的,所以不需要明确地声明。
按多个属性排序
假设我们想按姓氏排序。许多Characters有共同的姓氏。姓氏相同的字符之间的结果顺序未定义。我们可以先按姓氏排序,然后按名称确定顺序:
FOR c IN Characters
FILTER c.surname
SORT c.surname, c.name
LIMIT 10
RETURN {
surname: c.surname,
name: c.name
}
[
{ "surname": "Baelish", "name": "Petyr" },
{ "surname": "Baratheon", "name": "Joffrey" },
{ "surname": "Baratheon", "name": "Robert" },
{ "surname": "Baratheon", "name": "Stannis" },
{ "surname": "Baratheon", "name": "Tommen" },
{ "surname": "Bolton", "name": "Ramsay" },
{ "surname": "Bolton", "name": "Roose" },
{ "surname": "Clegane", "name": "Sandor" },
{ "surname": "Drogo", "name": "Khal" },
{ "surname": "Giantsbane", "name": "Tormund" }
]
排序前使用FILTER c.surname是为了限制返回结果中没有surname为null的数据。
按年龄分类
排序还可以通过数字值来确定,例如年龄:
FOR c IN Characters
FILTER c.age
SORT c.age
LIMIT 10
RETURN {
name: c.name,
age: c.age
}
[
{ "name": "Bran", "age": 10 },
{ "name": "Arya", "age": 11 },
{ "name": "Sansa", "age": 13 },
{ "name": "Jon", "age": 16 },
{ "name": "Theon", "age": 16 },
{ "name": "Daenerys", "age": 16 },
{ "name": "Samwell", "age": 17 },
{ "name": "Joffrey", "age": 19 },
{ "name": "Tyrion", "age": 32 },
{ "name": "Brienne", "age": 32 }
]
应用FILTER c.age以避免没有年龄属性的文档。