当前位置: 首页 > 工具软件 > ArangoDB > 使用案例 >

ArangoDB高级查询(一)

关宏毅
2023-12-01

条件匹配

匹配文档

到目前为止,我们要么查找单个文档,要么返回整个字符集合。对于查找,我们使用了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以避免没有年龄属性的文档。

 类似资料: