AQL中的类型和值顺序点击此标题看全文
AQL使用一组规则进行等式检查和比较,考虑到数据类型和实际值。
在检查等式或不等式时,或者确定值的排序顺序时,AQL使用一种确定性算法进行比较。
首先,通过数据类型比较操作数,只有当操作数具有相同的数据类型时,才通过数据值比较操作数。
在比较数据类型时,使用以下类型顺序:
null < bool < number < string < array(或list)< object(或document)
这意味着在AQL中,null是最小的类型,而object是具有最高顺序的类型。如果比较的操作数具有不同的类型,则确定比较结果并完成比较。
例如,布尔值true始终小于任何数字或字符串值、任何数组(甚至是空数组)和任何对象。另外,任何字符串值(即使是空字符串)始终大于任何数字值和布尔值(true和false)。
null < false
null < true
null < 0
null < ''
null < ' '
null < '0'
null < 'abc'
null < []
null < {}
false < true
false < 0
false < ''
false < ' '
false < '0'
false < 'abc'
false < []
false < {}
true < 0
true < ''
true < ' '
true < '0'
true < 'abc'
true < []
true < {}
0 < ''
0 < ' '
0 < '0'
0 < 'abc'
0 < []
0 < {}
'' < ' '
'' < '0'
'' < 'abc'
'' < []
'' < {}
[] < {}
如果两个比较的操作数具有相同的数据类型,则比较操作数的值。对于基本类型(null、boolean、number和string),结果定义如下:
null:null等于null
boolean:false小于true
number:数字值按其基数值排序
string:使用本地化比较进行字符串值排序,根据配置的服务器语言使用该语言的字母顺序规则进行排序
注意:与SQL不同,null可以与任何值(包括null本身)进行比较,而不会自动将结果转换为null。
对于复合类型(数组和对象),应用以下特殊规则:
通过按位置逐个比较它们的各个元素来比较两个数组值。对于每个位置,首先比较元素类型。如果类型不相等,则确定比较结果,并完成比较。如果类型相等,则比较两个元素的值。如果一个数组已经结束,而另一个数组在比较的位置仍然有一个元素,则使用null作为完全遍历的数组的元素值。
如果数组元素本身是复合值(数组或对象),则比较算法会递归检查元素的子值。递归比较元素的子元素。
[] < [0]
[1] < [2]
[1, 2] < [2]
[99, 99] < [100]
[false] < [true]
[false, 1] < [false, '']
两个对象操作数通过检查属性名称和值进行比较。首先比较属性名称。在比较属性名称之前,创建一个包含来自两个操作数的所有属性名称的组合数组,并按字典顺序对其进行排序。这意味着在比较两个对象时,声明属性的顺序不相关。
然后,遍历已组合和排序的属性名称数组,并查找两个比较的操作数的相应属性。如果一个对象没有具有所需名称的属性,则将其属性值视为null。最后,使用上述数据类型和值比较比较两个对象的属性值。对所有对象属性执行比较,直到存在明确的比较结果为止。如果找到明确的比较结果,则完成比较。如果没有明确的比较结果,则认为两个比较的对象相等。
{} == { "a": null }
{} < { "a": 1 }
{ "a": 1 } < { "a": 2 }
{ "b": 1 } < { "a": 0 }
{ "a": { "c": true } } < { "a": { "c": 0 } }
{ "a": { "c": true, "a": 0 } } < { "a": { "c": false, "a": 1 } }
{ "a": 1, "b": 2 } == { "b": 2, "a": 1 }