一般语法
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 expression or RETURN DISTINCT(如果查询的顶层没有FOR 循环,则不允许在查询的顶层。)
另外 arangodb3.3开始 return distinct 将不会改变其应用结果的顺序
注意:RETURN将关闭当前作用域并消除其中的所有局部变量。在处理子查询时,记住这一点很重要。
一般语法
FILTER expression
expression必须是评估为false或true的条件。如果条件结果为false,则将跳过当前元素,因此将不对其进行进一步处理,也不将其作为结果的一部分。
如果条件为true,则不跳过当前元素,可以对其进行进一步处理。有关条件中可以使用的比较运算符,逻辑运算符等的列表,请参见运算符。\
另外注意filter的位置 他会影响查询的结果
该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 expression direction(ASC or DESC)(默认升序ASC)
LIMIT count
LIMIT offset, count
该LET语句可用于为变量分配任意值。然后将该变量引入LET放置该语句的作用域中。
通用语法为:
LET variableName = expression
变量在AQL中是不可变的,这意味着它们不能重新分配:
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 keyExpression IN collection options
REMOVE keyExpression IN collection options RETURN OLD
更新操作的两种语法是:
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 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 document INTO collection [ OPTIONS options ]
INSERT document INTO collection RETURN NEW
IN关键字可以代替INTO并具有相同的含义。
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 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