Parcourir la source

更改

erlArango_v1
AICells il y a 5 ans
Parent
révision
66a18219b4
45 fichiers modifiés avec 1723 ajouts et 117 suppressions
  1. +2
    -2
      README.md
  2. +1
    -1
      include/agHttpCli.hrl
  3. +0
    -0
      src/agApi/agAdminMonitor.erl
  4. +0
    -0
      src/agApi/agAnalyzers.erl
  5. +0
    -0
      src/agApi/agAqlMod.erl
  6. +0
    -0
      src/agApi/agAsyncResultHandling.erl
  7. +0
    -0
      src/agApi/agBulkImportExport.erl
  8. +0
    -0
      src/agApi/agCluster.erl
  9. +0
    -0
      src/agApi/agCollections.erl
  10. +0
    -0
      src/agApi/agDbMgr.erl
  11. +0
    -0
      src/agApi/agDocuments.erl
  12. +0
    -0
      src/agApi/agEdges.erl
  13. +0
    -0
      src/agApi/agEndPoints.erl
  14. +0
    -0
      src/agApi/agFoxxServices.erl
  15. +0
    -0
      src/agApi/agGeneralGraphs.erl
  16. +0
    -0
      src/agApi/agHotBackup.erl
  17. +0
    -0
      src/agApi/agIndexes.erl
  18. +0
    -0
      src/agApi/agMiscFun.erl
  19. +0
    -0
      src/agApi/agRepairJobs.erl
  20. +0
    -0
      src/agApi/agReplication.erl
  21. +0
    -0
      src/agApi/agSimpleQueries.erl
  22. +0
    -0
      src/agApi/agTasks.erl
  23. +0
    -0
      src/agApi/agTransactions.erl
  24. +0
    -0
      src/agApi/agTraversals.erl
  25. +0
    -0
      src/agApi/agUserMgr.erl
  26. +0
    -0
      src/agApi/agViews.erl
  27. +293
    -0
      src/agDocs/Aql语法.md
  28. +1165
    -0
      src/agDocs/funs.md
  29. +0
    -0
      src/agDocs/启动相关.md
  30. +0
    -0
      src/agDocs/命名规范.md
  31. +22
    -0
      src/agDocs/类型和值的顺序.md
  32. +240
    -0
      src/agDocs/运算符.md
  33. +0
    -0
      src/agHttpCli/agAgencyPoolMgrExm.erl
  34. +0
    -0
      src/agHttpCli/agAgencyPoolMgrIns.erl
  35. +0
    -0
      src/agHttpCli/agAgencyPool_sup.erl
  36. +0
    -0
      src/agHttpCli/agAgencyUtils.erl
  37. +0
    -0
      src/agHttpCli/agHttpCli.erl
  38. +0
    -0
      src/agHttpCli/agHttpProtocol.erl
  39. +0
    -0
      src/agHttpCli/agKvsToBeam.erl
  40. +0
    -0
      src/agHttpCli/agMiscUtils.erl
  41. +0
    -0
      src/agHttpCli/agSslAgencyExm.erl
  42. +0
    -0
      src/agHttpCli/agSslAgencyIns.erl
  43. +0
    -0
      src/agHttpCli/agTcpAgencyExm.erl
  44. +0
    -0
      src/agHttpCli/agTcpAgencyIns.erl
  45. +0
    -114
      src/arangoDoc/Aql.md

+ 2
- 2
README.md Voir le fichier

@ -4,8 +4,8 @@
## 特点
高效,快速,简单易用。
1. 为了该驱动尽可能的高效,定制化封装了一个带连接池的http1.1的客户端(httpCli)
封装的httpCli与同类http客户端测试对比可参考:https://github.com/SisMaker/httpc_bench。
1. 为了该驱动尽可能的高效,定制化封装了一个带连接池的http1.1的客户端(agHttpCli)
封装的agHttpCli与同类http客户端测试对比可参考:https://github.com/SisMaker/httpc_bench。
2. 为了更加快速的decode和encode json数据,json库引入了jiffy,经过测试jiffy效率还是很不错的。
3. 该驱动可以使用连接池,也可以仅仅在单进程(非连接池模式)建立多个连接进行各种数据操作。使用连接池时支持同步与异步操作,如果要使用异步操作需要额外保存requestId
等待接收数据返回,当前改驱动封装的API均使用同步操作,如果需要异步操作可自行修改。单进程操作时仅支持同步操作。

+ 1
- 1
include/agHttpCli.hrl Voir le fichier

@ -6,7 +6,7 @@
-define(agBeamAgency, agBeamAgency).
%%
-define(DEFAULT_BASE_URL, <<"http://120.77.213.39:8529">>).
-define(DEFAULT_BASE_URL, <<"http://127.0.0.1:8529">>).
-define(DEFAULT_DBNAME, <<"_system">>).
-define(DEFAULT_USER, <<"root">>).
-define(DEFAULT_PASSWORD, <<"156736">>).

src/arangoApi/agAdminMonitor.erl → src/agApi/agAdminMonitor.erl Voir le fichier


src/arangoApi/agAnalyzers.erl → src/agApi/agAnalyzers.erl Voir le fichier


src/arangoApi/agAqlMod.erl → src/agApi/agAqlMod.erl Voir le fichier


src/arangoApi/agAsyncResultHandling.erl → src/agApi/agAsyncResultHandling.erl Voir le fichier


src/arangoApi/agBulkImportExport.erl → src/agApi/agBulkImportExport.erl Voir le fichier


src/arangoApi/agCluster.erl → src/agApi/agCluster.erl Voir le fichier


src/arangoApi/agCollections.erl → src/agApi/agCollections.erl Voir le fichier


src/arangoApi/agDbMgr.erl → src/agApi/agDbMgr.erl Voir le fichier


src/arangoApi/agDocuments.erl → src/agApi/agDocuments.erl Voir le fichier


src/arangoApi/agEdges.erl → src/agApi/agEdges.erl Voir le fichier


src/arangoApi/agEndPoints.erl → src/agApi/agEndPoints.erl Voir le fichier


src/arangoApi/agFoxxServices.erl → src/agApi/agFoxxServices.erl Voir le fichier


src/arangoApi/agGeneralGraphs.erl → src/agApi/agGeneralGraphs.erl Voir le fichier


src/arangoApi/agHotBackup.erl → src/agApi/agHotBackup.erl Voir le fichier


src/arangoApi/agIndexes.erl → src/agApi/agIndexes.erl Voir le fichier


src/arangoApi/agMiscFun.erl → src/agApi/agMiscFun.erl Voir le fichier


src/arangoApi/agRepairJobs.erl → src/agApi/agRepairJobs.erl Voir le fichier


src/arangoApi/agReplication.erl → src/agApi/agReplication.erl Voir le fichier


src/arangoApi/agSimpleQueries.erl → src/agApi/agSimpleQueries.erl Voir le fichier


src/arangoApi/agTasks.erl → src/agApi/agTasks.erl Voir le fichier


src/arangoApi/agTransactions.erl → src/agApi/agTransactions.erl Voir le fichier


src/arangoApi/agTraversals.erl → src/agApi/agTraversals.erl Voir le fichier


src/arangoApi/agUserMgr.erl → src/agApi/agUserMgr.erl Voir le fichier


src/arangoApi/agViews.erl → src/agApi/agViews.erl Voir le fichier


+ 293
- 0
src/agDocs/Aql语法.md Voir le fichier

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

+ 1165
- 0
src/agDocs/funs.md
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


src/arangoDoc/启动相关.md → src/agDocs/启动相关.md Voir le fichier


src/arangoDoc/命名规范.md → src/agDocs/命名规范.md Voir le fichier


+ 22
- 0
src/agDocs/类型和值的顺序.md Voir le fichier

@ -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。最后,使用前面提到的数据类型和值比较来比较两个对象/文档的属性值。对所有对象/文档属性执行比较,直到明确的比较结果为止。如果找到明确的比较结果,则比较结束。如果没有明确的比较结果,则将两个比较的对象/文档视为相等。

+ 240
- 0
src/agDocs/运算符.md Voir le fichier

@ -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 (不是)在运算符中
<<=,>=,> 小于,小于等于,大于等于,大于
.. 范围运算符
+, - 加,减
*,/,% 乘法,除法,模
!,+,- 逻辑否定,一元加,一元减
() 函数调用
. 会员访问
[] 索引值访问
[*] 扩张
:: 范围
括号(和)可用于强制执行不同的操作员评估顺序。

src/httpCli/agAgencyPoolMgrExm.erl → src/agHttpCli/agAgencyPoolMgrExm.erl Voir le fichier


src/httpCli/agAgencyPoolMgrIns.erl → src/agHttpCli/agAgencyPoolMgrIns.erl Voir le fichier


src/httpCli/agAgencyPool_sup.erl → src/agHttpCli/agAgencyPool_sup.erl Voir le fichier


src/httpCli/agAgencyUtils.erl → src/agHttpCli/agAgencyUtils.erl Voir le fichier


src/httpCli/agHttpCli.erl → src/agHttpCli/agHttpCli.erl Voir le fichier


src/httpCli/agHttpProtocol.erl → src/agHttpCli/agHttpProtocol.erl Voir le fichier


src/httpCli/agKvsToBeam.erl → src/agHttpCli/agKvsToBeam.erl Voir le fichier


src/httpCli/agMiscUtils.erl → src/agHttpCli/agMiscUtils.erl Voir le fichier


src/httpCli/agSslAgencyExm.erl → src/agHttpCli/agSslAgencyExm.erl Voir le fichier


src/httpCli/agSslAgencyIns.erl → src/agHttpCli/agSslAgencyIns.erl Voir le fichier


src/httpCli/agTcpAgencyExm.erl → src/agHttpCli/agTcpAgencyExm.erl Voir le fichier


src/httpCli/agTcpAgencyIns.erl → src/agHttpCli/agTcpAgencyIns.erl Voir le fichier


+ 0
- 114
src/arangoDoc/Aql.md Voir le fichier

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

Chargement…
Annuler
Enregistrer