|
|
@ -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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|