@ -0,0 +1,293 @@ | |||||
# for语法 | |||||
一般语法 | |||||
FOR variableName IN expression | |||||
图遍历 | |||||
FOR vertexVariableName, edgeVariableName, pathVariableName IN traversalExpression | |||||
视图 特殊关键字 | |||||
FOR variableName IN viewName SEARCH searchExpression | |||||
需要注意 视图不能用作遍历中的边集合 | |||||
FOR v IN 1..3 ANY startVertex viewName /* 错误的用法 */ | |||||
选项 对于集合和视图,该FOR构造支持可选的OPTIONS 后缀以修改行为。通用语法为: | |||||
FOR variableName IN expression OPTIONS {option: value, ...} | |||||
示例 | |||||
表达式返回的每个数组元素仅被访问一次。在所有情况下,表达式都必须返回一个数组。空数组也是允许的。当前数组元素可用于由variableName指定的变量中的进一步处理。 | |||||
FOR u IN users | |||||
RETURN u | |||||
这将遍历数组用户中的所有元素(注意:在这种情况下,此数组由名为“ users”的集合中的所有文档组成),并使当前数组元素在变量u中可用。在此示例中,不对u进行修改,而只是使用RETURN关键字将其推入结果中。 | |||||
注意:如此处所示,在基于集合的数组上进行迭代时,除非使用SORT 语句定义了明确的排序顺序,否则文档的顺序是不确定的。 | |||||
引入的变量在关闭放置FOR范围之前一直可用FOR。 | |||||
另一个示例使用静态声明的值数组进行迭代: | |||||
FOR year IN [ 2011, 2012, 2013 ] | |||||
RETURN { "year" : year, "isLeapYear" : year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) } | |||||
FOR也允许嵌套多个语句。当FOR语句嵌套时,FOR 将创建由各个语句返回的数组元素的叉积。 | |||||
FOR u IN users | |||||
FOR l IN locations | |||||
RETURN { "user" : u, "location" : l } | |||||
索引提示 | |||||
对于集合,通过此内联选项机制提供了索引提示。提示可以两种不同的格式指定。 | |||||
第一个格式选项是最简单的,只有一个索引名称。对于许多情况,这应该足够了。只要有可能在该FOR循环中使用索引的选择,优化器就会首先检查是否可以使用指定的索引。 | |||||
如果是这样,它将使用它,而不管它通常是否使用其他索引。如果它不能使用该索引,则它将退回到其正常逻辑以选择另一个索引。 | |||||
如果forceIndexHint: true指定了可选参数,那么它将不会回退,而是会产生错误。 | |||||
OPTIONS {indexHint: 'byName'[, forceIndexHint: <boolean>]} | |||||
第二个是按优先顺序排列的索引名称数组。以这种方式指定时,优化器的行为将与上述相同,但是将按照给定的顺序检查每个指定索引的可行性,并退回其正常逻辑或仅在未指定指定条件时失败指标是可行的。 | |||||
OPTIONS {indexHint: ['byName', 'byColor'][, forceIndexHint: <boolean>]} | |||||
# return语法 | |||||
该RETURN语句可用于产生查询结果。必须RETURN在数据选择查询的每个块的末尾指定一条语句,否则查询结果将是不确定的。RETURN在数据修改查询的主级别使用 是可选的。 | |||||
一般语法为RETURN: | |||||
RETURN expression or RETURN DISTINCT(如果查询的顶层没有FOR 循环,则不允许在查询的顶层。) | |||||
另外 arangodb3.3开始 return distinct 将不会改变其应用结果的顺序 | |||||
注意:RETURN将关闭当前作用域并消除其中的所有局部变量。在处理子查询时,记住这一点很重要。 | |||||
# filter语法 | |||||
一般语法 | |||||
FILTER expression | |||||
expression必须是评估为false或true的条件。如果条件结果为false,则将跳过当前元素,因此将不对其进行进一步处理,也不将其作为结果的一部分。 | |||||
如果条件为true,则不跳过当前元素,可以对其进行进一步处理。有关条件中可以使用的比较运算符,逻辑运算符等的列表,请参见运算符。\ | |||||
另外注意filter的位置 他会影响查询的结果 | |||||
# search语法 | |||||
该SEARCH关键字开始语言结构类型为ArangoSearch的过滤器视图。从概念上讲,视图只是另一个文档数据源,类似于数组或文档/边缘集合,您可以在其上使用AQL中的FOR操作进行迭代: | |||||
可选SEARCH操作提供以下功能: | |||||
1. 根据AQL布尔表达式和函数过滤文档 | |||||
2. 匹配位于由快速索引支持的不同集合中的文档 | |||||
3. 根据每个文档与搜索条件的匹配程度对结果集进行排序 | |||||
一般语法 | |||||
FOR doc IN viewName | |||||
SEARCH expression OPTIONS {…} | |||||
... | |||||
SEARCH与相比FILTER,该语句被视为FOR操作的一部分 ,而不是单独的语句。它不能随意放置在查询中,也不能多次放置在FOR循环体内。 | |||||
FOR ... IN必须紧随其后的是View的名称,而不是集合的名称。该SEARCH操作必须遵循接下来,其他操作之前SEARCH,如FILTER, | |||||
COLLECT等没有在这个位置上允许的。SEARCH在表达式之后,可以进行后续操作, 但包括SORT根据ArangoSearch View计算的排名值对搜索结果进行排序。 | |||||
expression必须是ArangoSearch表达式。在搜索和排序阶段,ArangoSearch的全部功能都通过特殊的ArangoSearch功能加以利用和公开。最重要的是,支持常见的AQL运算符: | |||||
AND, && | |||||
OR, || | |||||
NOT, ! | |||||
== | |||||
<= | |||||
>= | |||||
< | |||||
> | |||||
!= | |||||
IN (数组或范围),也 NOT IN | |||||
ArangoSearch不会考虑字母的字母顺序,即针对视图的SEARCH操作中的范围查询将不会遵循已定义的Analyzer语言环境或服务器语言(启动选项--default-language)的语言规则!另请参阅已知问题。 | |||||
FOR doc IN viewName | |||||
SEARCH ANALYZER(doc.text == "quick" OR doc.text == "brown", "text_en") | |||||
RETURN doc | |||||
支持数组比较运算符(在v3.6.0中引入): | |||||
LET tokens = TOKENS("some input", "text_en") // ["some", "input"] | |||||
FOR doc IN myView SEARCH tokens ALL IN doc.title RETURN doc // dynamic conjunction | |||||
FOR doc IN myView SEARCH tokens ANY IN doc.title RETURN doc // dynamic disjunction | |||||
FOR doc IN myView SEARCH tokens NONE IN doc.title RETURN doc // dynamic negation | |||||
FOR doc IN myView SEARCH tokens ALL > doc.title RETURN doc // dynamic conjunction with comparison | |||||
FOR doc IN myView SEARCH tokens ANY <= doc.title RETURN doc // dynamic disjunction with comparison | |||||
请注意,不支持内联表达式和其他一些功能 SEARCH。如果表达式无效,服务器将引发查询错误。 | |||||
所述OPTIONS关键字和一个对象可以任选地按照搜索表达式来设置搜索选项。 | |||||
处理非索引字段固定链接 | |||||
未配置为由视图索引的文档属性被SEARCH视为不存在。这会影响仅从视图发出的文档的测试。 | |||||
如果需要,可以使用特殊的includeAllFields View属性为源文档的所有(子)字段建立索引。 | |||||
# sort语法 | |||||
SORT expression direction(ASC or DESC)(默认升序ASC) | |||||
# limit语法 | |||||
LIMIT count | |||||
LIMIT offset, count | |||||
# let语法 | |||||
该LET语句可用于为变量分配任意值。然后将该变量引入LET放置该语句的作用域中。 | |||||
通用语法为: | |||||
LET variableName = expression | |||||
变量在AQL中是不可变的,这意味着它们不能重新分配: | |||||
# collect语法 | |||||
COLLECT关键字可用来组由一个或多个基团的标准阵列。 | |||||
该COLLECT语句将消除当前范围内的所有局部变量。之后,COLLECT只有由COLLECT自身引入的变量才可用。 | |||||
操作有几种语法变体COLLECT: | |||||
COLLECT variableName = expression | |||||
COLLECT variableName = expression INTO groupsVariable | |||||
COLLECT variableName = expression INTO groupsVariable = projectionExpression | |||||
COLLECT variableName = expression INTO groupsVariable KEEP keepVariable | |||||
COLLECT variableName = expression WITH COUNT INTO countVariable | |||||
COLLECT variableName = expression AGGREGATE variableName = aggregateExpression | |||||
COLLECT variableName = expression AGGREGATE variableName = aggregateExpression INTO groupsVariable | |||||
COLLECT AGGREGATE variableName = aggregateExpression | |||||
COLLECT AGGREGATE variableName = aggregateExpression INTO groupsVariable | |||||
COLLECT WITH COUNT INTO countVariable | |||||
所有变体都可以选择以OPTIONS { … }子句结尾。 | |||||
# remove语法 | |||||
REMOVE keyExpression IN collection options | |||||
REMOVE keyExpression IN collection options RETURN OLD | |||||
# udpate语法 | |||||
更新操作的两种语法是: | |||||
UPDATE document IN collection options | |||||
UPDATE keyExpression WITH document IN collection options | |||||
UPDATE document IN collection options RETURN OLD | |||||
UPDATE document IN collection options RETURN NEW | |||||
UPDATE keyExpression WITH document IN collection options RETURN OLD | |||||
UPDATE keyExpression WITH document IN collection options RETURN NEW、 | |||||
# replace语法 | |||||
REPLACE document IN collection options | |||||
REPLACE keyExpression WITH document IN collection options | |||||
REPLACE document IN collection options RETURN OLD | |||||
REPLACE document IN collection options RETURN NEW | |||||
REPLACE keyExpression WITH document IN collection options RETURN OLD | |||||
REPLACE keyExpression WITH document IN collection options RETURN NEW | |||||
以下查询使用NEW伪值返回替换的文档(不包含某些系统属性): | |||||
FOR u IN users | |||||
REPLACE u WITH { value: "test" } IN users | |||||
LET replaced = NEW | |||||
RETURN UNSET(replaced, '_key', '_id', '_rev') | |||||
# insert语法 | |||||
INSERT document INTO collection [ OPTIONS options ] | |||||
INSERT document INTO collection RETURN NEW | |||||
IN关键字可以代替INTO并具有相同的含义。 | |||||
# upsert语法 | |||||
UPSERT searchExpression INSERT insertExpression UPDATE updateExpression IN collection options | |||||
UPSERT searchExpression INSERT insertExpression REPLACE updateExpression IN collection options | |||||
当使用UPDATEupsert操作的变体时,找到的文档将被部分更新,这意味着仅updateExpression中指定的属性将被更新或添加。使用REPLACEupsert 的变体时,现有文档将被updateExpression的上下文替换。 | |||||
更新文档将使用服务器生成的值来修改文档的修订号。系统属性_id,_key和_rev无法更新,_from和_to可以更新。 | |||||
# with语法 | |||||
WITH managers | |||||
FOR v, e, p IN OUTBOUND 'users/1' usersHaveManagers | |||||
RETURN { v, e, p } | |||||
插入文档 | |||||
语法是INSERT document INTO collectionName。该文档是一个对象,您可以从JavaScript或JSON中了解它,它由属性键和值对组成。 | |||||
属性键周围的引号在AQL中是可选的。键总是字符序列(字符串),而属性值可以有不同的类型: | |||||
空值 | |||||
布尔值(true,false) | |||||
数字(整数和浮点数) | |||||
串 | |||||
排列 | |||||
宾语 | |||||
该LET关键字定义一个带有名称数据的变量和一个对象数组作为值,因此LET variableName = valueExpression表达式是一个文字数组定义[ {...}, {...}, ... ]。 | |||||
FOR variableName IN expression用于迭代数据数组的每个元素 。在每个循环中,将一个元素分配给变量d。然后在INSERT语句中使用此变量而不是文字对象定义。基本上是做什么的: | |||||
INSERT { | |||||
"name": "Robert", | |||||
"surname": "Baratheon", | |||||
"alive": false, | |||||
"traits": ["A","H","C"] | |||||
} INTO Characters | |||||
INSERT { | |||||
"name": "Jaime", | |||||
"surname": "Lannister", | |||||
"alive": true, | |||||
"age": 36, | |||||
"traits": ["A","F","B"] | |||||
} INTO Characters | |||||
... | |||||
注意:AQL不允许INSERT在单个查询中针对同一集合的多个操作。然而, 允许它作为FOR循环体,插入多个文档,就像我们对上面的查询所做的那样。 | |||||
FOR c IN Characters_1 RETURN c | |||||
循环的语法是FOR variableName IN collectionName。对于集合中的每个文档,将为c分配一个文档,然后根据循环体返回该文档。查询返回我们先前存储的所有字符。 | |||||
该文档包含我们存储的四个属性,以及数据库系统添加的另外三个属性。每个文档都需要一个唯一的文档_key,用于在集合中标识它。它_id是计算属性,集合名称, | |||||
正斜杠/和文档键的串联。它唯一标识数据库中的文档。_rev是系统管理的修订版ID。 | |||||
用户可以在创建文档时提供文档键,也可以自动分配唯一值。它以后不能改变。以下划线开头的所有三个系统属性_都是只读的。 | |||||
我们可以使用文档密钥或文档ID在AQL函数的帮助下检索特定文档DOCUMENT() | |||||
更新文档 | |||||
UPDATE documentKey WITH object IN collectionName l列出的属性更新指定的文档(存在则添加它们) | |||||
要更新整个文档 整个用replace | |||||
可以用循环 更新或者替换属性 | |||||
FOR c IN Character | |||||
UPDATE c with {swason: 1} IN Character | |||||
删除文件 | |||||
要从集合中删除文档 执行 REMOVE | |||||
REMOVE "201213" IN Character | |||||
FOR C IN Characters | |||||
REMOVE c IN Characters | |||||
匹配条件 | |||||
为了查找满足条件的文档 FILTER AQL | |||||
FOR c IN Characters | |||||
FILTER c.age >= 12 | |||||
RETURN c.name | |||||
多种条件 | |||||
FOR c IN Characters | |||||
FILTER c.age 《 13 | |||||
FILTER c.age != null | |||||
RETURN {name: c.name, age: c.age} 可以用AND运算符 | |||||
同时也有OR运算符 | |||||
限制结果计数 | |||||
FOR c IN Characters_1 | |||||
LIMIT 5 | |||||
RETURN c.name | |||||
FOR c IN Characters | |||||
LIMIT 2,5 | |||||
RETURN c.name | |||||
@ -0,0 +1,22 @@ | |||||
类型和值顺序 | |||||
在检查是否相等或不相等或确定值的排序顺序时,AQL使用确定性算法,该算法同时考虑数据类型和实际值。 | |||||
比较的操作数首先按其数据类型进行比较,如果操作数具有相同的数据类型,则仅按其数据值进行比较。 | |||||
比较数据类型时,使用以下类型顺序: | |||||
null < bool < number < string < array/list < object/document | |||||
这意味着null是AQL中最小的类型,而document是具有最高顺序的类型。如果比较的操作数具有不同的类型,则确定比较结果并完成比较。 | |||||
如果两个比较的操作数具有相同的数据类型,则将比较操作数的值。对于基本类型(null,布尔值,数字和字符串),结果定义如下: | |||||
null:null等于null | |||||
布尔值:false小于true | |||||
数字:数值按基数排序 | |||||
字符串:使用本地化比较对字符串值进行排序,使用配置的 服务器语言 根据该语言的字母顺序规则进行排序 | |||||
注意:与SQL不同,可以将null与任何值进行比较,包括null 本身,而不会自动将结果转换为null。 | |||||
对于化合物,将应用以下特殊规则: | |||||
从第一个元素开始,通过逐个位置比较它们的各个元素来比较两个数组值。对于每个位置,首先比较元素类型。如果类型不相等,则确定比较结果,并且比较结束。如果类型相等,则将比较两个元素的值。如果其中一个数组已完成,而另一个数组在比较位置仍然有一个元素,则将null用作完全遍历数组的元素值。 | |||||
如果数组元素本身是复合值(数组或对象/文档),则比较算法将递归检查元素的子值。递归比较元素的子元素。 | |||||
通过检查属性名称和值来比较两个对象/文档操作数。首先比较属性名称。在比较属性名称之前,将创建两个操作数的所有属性名称的组合数组,并按字典顺序进行排序。这意味着在比较两个对象/文档时,在对象/文档中声明属性的顺序无关紧要。 | |||||
然后遍历组合和排序的属性名称数组,然后从两个比较的操作数中查找相应的属性。如果对象/文档之一不具有具有所寻找名称的属性,则其属性值被视为null。最后,使用前面提到的数据类型和值比较来比较两个对象/文档的属性值。对所有对象/文档属性执行比较,直到明确的比较结果为止。如果找到明确的比较结果,则比较结束。如果没有明确的比较结果,则将两个比较的对象/文档视为相等。 |
@ -0,0 +1,240 @@ | |||||
经营者 | |||||
AQL支持许多可在表达式中使用的运算符。有比较,逻辑,算术和三元运算符。 | |||||
比较运算符 | |||||
比较(或关系)运算符比较两个操作数。它们可以与任何输入数据类型一起使用,并将返回布尔结果值。 | |||||
支持以下比较运算符: | |||||
操作员 描述 | |||||
== 平等 | |||||
!= 不等式 | |||||
< 少于 | |||||
<= 小于或等于 | |||||
> 比...更棒 | |||||
>= 大于或等于 | |||||
IN 测试值是否包含在数组中 | |||||
NOT IN 测试值是否不包含在数组中 | |||||
LIKE 测试字符串值是否与模式匹配 | |||||
NOT LIKE 测试字符串值是否与模式不匹配 | |||||
=~ 测试字符串值是否与正则表达式匹配 | |||||
!~ 测试字符串值是否与正则表达式不匹配 | |||||
如果可以评估比较结果,则每个比较运算符都将返回一个布尔值;如果比较结果为true,则返回true;否则返回false 。 | |||||
比较运算符接受第一和第二操作数的任何数据类型。但是,IN并且NOT IN仅在其右侧操作数是数组的情况下才会返回有意义的结果。LIKE并且NOT LIKE仅在两个操作数均为字符串值时才执行。如果比较的操作数具有不同或不合理的类型,则比较运算符将不执行任何隐式类型转换。 | |||||
AQL中比较操作的一些示例: | |||||
0 == null // false | |||||
1 > 0 // true | |||||
true != null // true | |||||
45 <= "yikes!" // true | |||||
65 != "65" // true | |||||
65 == 65 // true | |||||
1.23 > 1.32 // false | |||||
1.5 IN [ 2, 3, 1.5 ] // true | |||||
"foo" IN null // false | |||||
42 NOT IN [ 17, 40, 50 ] // true | |||||
"abc" == "abc" // true | |||||
"abc" == "ABC" // false | |||||
"foo" LIKE "f%" // true | |||||
"foo" NOT LIKE "f%" // false | |||||
"foo" =~ "^f[o].$" // true | |||||
"foo" !~ "[a-z]+bar$" // true | |||||
该LIKE运营商检查是否其左操作数以其右操作数指定的模式相匹配。该模式可以包含常规字符和通配符。支持的通配符_将匹配单个任意字符,并%匹配任意数量的任意字符。文字%,_需要以反斜杠转义。反斜杠需要自己转义,这实际上意味着两个反斜线字符必须在文字百分号或下划线之前。在arangosh中,需要进行额外的转义,使其在要转义的字符之前总共加四个反斜杠。 | |||||
"abc" LIKE "a%" // true | |||||
"abc" LIKE "_bc" // true | |||||
"a_b_foo" LIKE "a\\_b\\_foo" // true | |||||
LIKE操作员执行的模式匹配区分大小写。 | |||||
该NOT LIKE经营者具有相同特性的LIKE运营商,但与否定的结果。因此,它与相同NOT (… LIKE …)。请注意括号,这对于某些表达式是必需的: | |||||
FOR doc IN coll | |||||
RETURN NOT doc.attr LIKE "…" | |||||
return表达式将转换为LIKE(!doc.attr, "…"),从而产生意外结果。NOT(doc.attr LIKE "…")变得更加合理! LIKE(doc.attr, "…")。 | |||||
正则表达式运算符=~并!~期望它们的左手操作数是字符串,而期望它们的右手操作数是包含有效的正则表达式的字符串,如AQL函数REGEX_TEST()的文档中所指定 。 | |||||
数组比较运算符 | |||||
比较运算符也作为数组变量存在。在阵列变型中,操作者的前缀的关键字之一ALL,ANY 或NONE。使用这些关键字之一可以更改操作员的行为,以便对其所有,任何或不使用其左手参数值执行比较操作。因此,期望数组运算符的左手参数是一个数组。 | |||||
例子: | |||||
[ 1, 2, 3 ] ALL IN [ 2, 3, 4 ] // false | |||||
[ 1, 2, 3 ] ALL IN [ 1, 2, 3 ] // true | |||||
[ 1, 2, 3 ] NONE IN [ 3 ] // false | |||||
[ 1, 2, 3 ] NONE IN [ 23, 42 ] // true | |||||
[ 1, 2, 3 ] ANY IN [ 4, 5, 6 ] // false | |||||
[ 1, 2, 3 ] ANY IN [ 1, 42 ] // true | |||||
[ 1, 2, 3 ] ANY == 2 // true | |||||
[ 1, 2, 3 ] ANY == 4 // false | |||||
[ 1, 2, 3 ] ANY > 0 // true | |||||
[ 1, 2, 3 ] ANY <= 1 // true | |||||
[ 1, 2, 3 ] NONE < 99 // false | |||||
[ 1, 2, 3 ] NONE > 10 // true | |||||
[ 1, 2, 3 ] ALL > 2 // false | |||||
[ 1, 2, 3 ] ALL > 0 // true | |||||
[ 1, 2, 3 ] ALL >= 3 // false | |||||
["foo", "bar"] ALL != "moo" // true | |||||
["foo", "bar"] NONE == "bar" // false | |||||
["foo", "bar"] ANY == "foo" // true | |||||
请注意,这些运算符尚未优化。索引将不被使用。 | |||||
逻辑运算符 | |||||
AQL支持以下逻辑运算符: | |||||
&& 逻辑与运算符 | |||||
|| 逻辑或运算符 | |||||
! 逻辑非/否定运算符 | |||||
AQL还支持逻辑运算符的以下替代形式: | |||||
AND 逻辑与运算符 | |||||
OR 逻辑或运算符 | |||||
NOT 逻辑非/否定运算符 | |||||
替代形式是别名,在功能上等同于常规运算符。 | |||||
AQL中的两个操作数逻辑运算符将使用短路求值执行(除非其中一个操作数是子查询或包含子查询。在这种情况下,子查询将在逻辑运算符之前被提取一个求值)。 | |||||
AQL中逻辑运算符的结果定义如下: | |||||
lhs && rhslhs如果是false或将false转换为布尔值时将返回。如果将lhsis true或be true转换为布尔值, rhs则将返回。 | |||||
lhs || rhslhs如果是true或将true转换为布尔值时将返回。如果将lhsis false或be false转换为布尔值, rhs则将返回。 | |||||
! value将返回value转换为布尔值的取反值 | |||||
AQL中逻辑操作的一些示例: | |||||
u.age > 15 && u.address.city != "" | |||||
true || false | |||||
NOT u.isInvalid | |||||
1 || ! 0 | |||||
允许将非布尔值传递给逻辑运算符。任何非布尔操作数都将由运算符隐式转换为布尔值,而不会使查询中止。 | |||||
在一个布尔值转换的工作原理如下: | |||||
null 将被转换为 false | |||||
布尔值保持不变 | |||||
所有不等于零的数字为true,零为false | |||||
空字符串是false,所有其他字符串是true | |||||
数组([ ])和对象/文档({ })是true不论其内容如何 | |||||
逻辑和与逻辑或运算的结果现在可以具有任何数据类型,并且不一定是布尔值。 | |||||
例如,以下逻辑运算将返回布尔值: | |||||
25 > 1 && 42 != 7 // true | |||||
22 IN [ 23, 42 ] || 23 NOT IN [ 22, 7 ] // true | |||||
25 != 25 // false | |||||
…,而以下逻辑运算将不会返回布尔值: | |||||
1 || 7 // 1 | |||||
null || "foo" // "foo" | |||||
null && true // null | |||||
true && 23 // 23 | |||||
算术运算符 | |||||
算术运算符对两个数字操作数执行算术运算。算术运算的结果还是一个数值。 | |||||
AQL支持以下算术运算符: | |||||
+ 加成 | |||||
- 减法 | |||||
* 乘法 | |||||
/ 师 | |||||
% 模数 | |||||
一元加号和一元减号也受支持: | |||||
LET x = -5 | |||||
LET y = 1 | |||||
RETURN [-x, +y] | |||||
// [5, 1] | |||||
为了求幂,有一个数字函数 POW()。base ** exp不支持语法。 | |||||
对于字符串连接,必须使用字符串函数 CONCAT()。将两个字符串与加号("foo" + "bar")结合使用将不起作用!另请参阅常见错误。 | |||||
一些算术运算示例: | |||||
1 + 1 | |||||
33 - 99 | |||||
12.4 * 4.5 | |||||
13.0 / 0.1 | |||||
23 % 7 | |||||
-15 | |||||
+9.99 | |||||
算术运算符接受任何类型的操作数。将非数字值传递给算术运算符将使用TO_NUMBER()函数应用的类型转换规则将操作数转换为数字: | |||||
null 将被转换为 0 | |||||
false将转换为0,将true转换为1 | |||||
有效数值保持不变,但NaN和Infinity将转换为 0 | |||||
如果字符串值包含数字的有效字符串表示形式,则将它们转换为数字。字符串开头或结尾的所有空格都将被忽略。具有其他内容的字符串将转换为数字0 | |||||
将一个空数组转换为0,将具有一个成员的数组转换为其唯一成员的数字表示形式。具有更多成员的数组将转换为number 0。 | |||||
对象/文档将转换为数字0。 | |||||
产生无效值的算术运算,例如1 / 0(除以零)也将产生结果值null。该查询不会终止,但是您可能会看到警告。 | |||||
这里有一些例子: | |||||
1 + "a" // 1 | |||||
1 + "99" // 100 | |||||
1 + null // 1 | |||||
null + 1 // 1 | |||||
3 + [ ] // 3 | |||||
24 + [ 2 ] // 26 | |||||
24 + [ 2, 4 ] // 0 | |||||
25 - null // 25 | |||||
17 - true // 16 | |||||
23 * { } // 0 | |||||
5 * [ 7 ] // 35 | |||||
24 / "12" // 2 | |||||
1 / 0 // 0 | |||||
三元运算符 | |||||
AQL还支持可用于条件评估的三元运算符。三元运算符期望布尔条件作为其第一个操作数,如果条件的计算结果为true,则返回第二个操作数的结果,否则返回第三个操作数。 | |||||
例子 | |||||
u.age > 15 || u.active == true ? u.userId : null | |||||
还有只有两个操作数的三元运算符的快捷方式。当布尔条件的表达式和返回值应该相同时,可以使用此变体: | |||||
例子 | |||||
u.value ? : 'value is null, 0 or not present' | |||||
范围运算符 | |||||
AQL支持使用..运算符表达简单的数字范围。该运算符可用于轻松地迭代数字序列。 | |||||
所述..操作者将产生整数值的阵列在所定义的范围内,与两个边界值包括在内。 | |||||
例子 | |||||
2010..2013 | |||||
将产生以下结果: | |||||
[ 2010, 2011, 2012, 2013 ] | |||||
使用范围运算符等效于编写一个整数值的数组,该整数值在范围的边界所指定的范围内。如果范围运算符的边界为非整数,则它们将首先转换为整数值。 | |||||
还有一个RANGE()函数。 | |||||
数组运算符 | |||||
AQL提供阵列运营商[*]为 数组变量扩展和 [**]用于阵列收缩。 | |||||
运算符优先级 | |||||
AQL中的运算符优先级与其他熟悉的语言相似(最低优先级优先): | |||||
运营商 描述 | |||||
, 逗号分隔符 | |||||
DISTINCT 独特修饰符(返回操作) | |||||
? : 三元运算符 | |||||
= 变量赋值(LET操作) | |||||
WITH 与运算符一起(WITH / UPDATE / REPLACE / COLLECT操作) | |||||
INTO 进入运算符(INSERT / UPDATE / REPLACE / REMOVE / COLLECT操作) | |||||
|| 逻辑或 | |||||
&& 逻辑与 | |||||
OUTBOUND,INBOUND,ANY,ALL,NONE 图遍历方向,数组比较运算符 | |||||
==,!=,LIKE,NOT LIKE,=~,!~ (in)相等,通配符(非)匹配,正则表达式(非)匹配 | |||||
IN, NOT IN (不是)在运算符中 | |||||
<,<=,>=,> 小于,小于等于,大于等于,大于 | |||||
.. 范围运算符 | |||||
+, - 加,减 | |||||
*,/,% 乘法,除法,模 | |||||
!,+,- 逻辑否定,一元加,一元减 | |||||
() 函数调用 | |||||
. 会员访问 | |||||
[] 索引值访问 | |||||
[*] 扩张 | |||||
:: 范围 | |||||
括号(和)可用于强制执行不同的操作员评估顺序。 |
@ -1,114 +0,0 @@ | |||||
插入文档 | |||||
语法是INSERT document INTO collectionName。该文档是一个对象,您可以从JavaScript或JSON中了解它,它由属性键和值对组成。 | |||||
属性键周围的引号在AQL中是可选的。键总是字符序列(字符串),而属性值可以有不同的类型: | |||||
空值 | |||||
布尔值(true,false) | |||||
数字(整数和浮点数) | |||||
串 | |||||
排列 | |||||
宾语 | |||||
该LET关键字定义一个带有名称数据的变量和一个对象数组作为值,因此LET variableName = valueExpression表达式是一个文字数组定义[ {...}, {...}, ... ]。 | |||||
FOR variableName IN expression用于迭代数据数组的每个元素 。在每个循环中,将一个元素分配给变量d。然后在INSERT语句中使用此变量而不是文字对象定义。基本上是做什么的: | |||||
INSERT { | |||||
"name": "Robert", | |||||
"surname": "Baratheon", | |||||
"alive": false, | |||||
"traits": ["A","H","C"] | |||||
} INTO Characters | |||||
INSERT { | |||||
"name": "Jaime", | |||||
"surname": "Lannister", | |||||
"alive": true, | |||||
"age": 36, | |||||
"traits": ["A","F","B"] | |||||
} INTO Characters | |||||
... | |||||
注意:AQL不允许INSERT在单个查询中针对同一集合的多个操作。然而, 允许它作为FOR循环体,插入多个文档,就像我们对上面的查询所做的那样。 | |||||
FOR c IN Characters_1 RETURN c | |||||
循环的语法是FOR variableName IN collectionName。对于集合中的每个文档,将为c分配一个文档,然后根据循环体返回该文档。查询返回我们先前存储的所有字符。 | |||||
该文档包含我们存储的四个属性,以及数据库系统添加的另外三个属性。每个文档都需要一个唯一的文档_key,用于在集合中标识它。它_id是计算属性,集合名称, | |||||
正斜杠/和文档键的串联。它唯一标识数据库中的文档。_rev是系统管理的修订版ID。 | |||||
用户可以在创建文档时提供文档键,也可以自动分配唯一值。它以后不能改变。以下划线开头的所有三个系统属性_都是只读的。 | |||||
我们可以使用文档密钥或文档ID在AQL函数的帮助下检索特定文档DOCUMENT() | |||||
更新文档 | |||||
UPDATE documentKey WITH object IN collectionName l列出的属性更新指定的文档(存在则添加它们) | |||||
要更新整个文档 整个用replace | |||||
可以用循环 更新或者替换属性 | |||||
FOR c IN Character | |||||
UPDATE c with {swason: 1} IN Character | |||||
删除文件 | |||||
要从集合中删除文档 执行 REMOVE | |||||
REMOVE "201213" IN Character | |||||
FOR C IN Characters | |||||
REMOVE c IN Characters | |||||
匹配条件 | |||||
为了查找满足条件的文档 FILTER AQL | |||||
FOR c IN Characters | |||||
FILTER c.age >= 12 | |||||
RETURN c.name | |||||
多种条件 | |||||
FOR c IN Characters | |||||
FILTER c.age 《 13 | |||||
FILTER c.age != null | |||||
RETURN {name: c.name, age: c.age} 可以用AND运算符 | |||||
同时也有OR运算符 | |||||
限制结果计数 | |||||
FOR c IN Characters_1 | |||||
LIMIT 5 | |||||
RETURN c.name | |||||
FOR c IN Characters | |||||
LIMIT 2,5 | |||||
RETURN c.name | |||||