RETURN操作
你可以使用RETURN操作来返回一个查询的结果集
在一个数据访问查询中,RETURN操作时必须的,否则这次查询的结果是未定义的。在数据修改查询中,顶层使用RETURN关键字是可选的。
语法
RETURN的一般语法
RETURN expression
同样适用于RETURN DISTINCT
在 RETURN 语句所在的代码块中,每次迭代都会生成一个返回表达式的结果。这意味着RETURN语句的结果始终是一个数组形式。如果查询没有匹配到任何文档,则结果会是一个空数组;如果只返回了一个单一值,那么这个值会被包装在一个只有一个元素的数组中。
要在不修改的情况下返回当前迭代数组中的所有元素,可以使用以下简单形式:
FOR variableName IN expression
RETURN variableName
由于RETURN允许指定表达式,因此可以执行任意计算来计算结果元素。RETURN所在范围内的任何有效变量都可以用于计算。
使用
要迭代名为users的集合的所有文档并返回完整文档,可以编写:
FOR u IN users
RETURN u
在for循环的每次迭代中,用户集合的一个文档都被分配给变量u,并在本例中未经修改地返回。只要返回每个文档的一个属性,可以使用不同的返回表达式:
FOR u IN users
RETURN u.name
或者,要返回多个属性,可以像这样构造一个对象:
FOR u IN users
RETURN { name: u.name, age: u.age }
注意:RETURN将关闭当前作用域并消除其中的所有局部变量。在处理子查询时,请记住这一点。
还支持动态属性名称:
FOR u IN users
RETURN { [ u._id ]: u.age }
在本例中,每个用户的document_id被用作计算属性关键字的表达式:
[
{
"users/9883": 32
},
{
"users/9915": 27
},
{
"users/10074": 69
}
]
在这种情况下,如果希望得到一个单一对象,该对象以用户ID为键、年龄为值的映射关系,那么需要将每个用户的查询结果合并成一个对象。
RETURN MERGE(
FOR u IN users
RETURN { [ u._id ]: u.age }
)
[
{
"users/10074": 69,
"users/9883": 32,
"users/9915": 27
}
]
在进行合并操作时,务必注意如果键表达式计算出的值有重复,那么使用MERGE()函数时,具有相同名称的键/值对中只有一个会保留下来。为了避免这种情况,可以不使用动态属性名,而是使用静态名称,并将所有文档属性作为属性值返回:
FOR u IN users
RETURN { name: u.name, age: u.age }
[
{
"name": "John Smith",
"age": 32
},
{
"name": "James Hendrix",
"age": 69
},
{
"name": "Katie Foster",
"age": 27
}
]
RETURN DISTINCT
RETURN后面可以有选择地跟DISTINCT关键字。DISTINCT关键字将确保RETURN语句返回的值的唯一性:
FOR variableName IN expression
RETURN DISTINCT expression
如果查询前面没有FOR循环,则不允许在查询的顶级上使用RETURN DISTINCT。
以下示例返回[“foo”、“bar”、“baz”]:
FOR value IN ["foo", "bar", "bar", "baz", "foo"]
RETURN DISTINCT value
如果DISTINCT应用于一个本身是数组或子查询的表达式上,那么DISTINCT操作不会使得每个数组或子查询结果中的值变得唯一,而是确保整个结果集中包含的是不同的数组或子查询结果。若要使数组或子查询的结果中元素唯一,应该直接对数组或子查询应用DISTINCT
例如,以下查询将DISTINCT应用于其子查询结果,但不应用于子查询内部:
FOR what IN 1..2
RETURN DISTINCT (
FOR i IN [ 1, 2, 3, 4, 1, 3 ]
RETURN i
)
在这里,我们将有一个FOR循环,其中有两个迭代,每个迭代执行一个子查询。这里的DISTINCT应用于两个子查询结果。两个子查询都返回相同的结果值(即[1,2,3,4,1,3]),因此在DISTINCT之后,只剩下一次值[1,2、3,4、1,3]:
[
[ 1, 2, 3, 4, 1, 3 ]
]
如果目标是在子查询中应用DISTINCT,则需要将其移动到那里:
FOR what IN 1..2
LET sub = (
FOR i IN [ 1, 2, 3, 4, 1, 3 ]
RETURN DISTINCT i
)
RETURN sub
在上述情况下,DISTINCT将使子查询结果唯一,因此每个子查询将返回一个唯一的值数组([1,2,3,4])。由于子查询执行了两次,并且顶层没有DISTINCT,因此该数组将返回两次:
[
[ 1, 2, 3, 4 ],
[ 1, 2, 3, 4 ]
]