【AQL】RETURN操作

RETURN operation in AQL

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 ]
]
  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值