各种笔记
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

9.9 KiB

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