Перейти к содержанию

RETURN

Оператор RETURN можно использовать для получения результата запроса. Обязательно указывать оператор RETURN в конце каждого блока в запросе на выборку данных, иначе результат запроса будет неопределен. Использование RETURN на основном уровне в запросах на модификацию данных необязательно.

Синтаксис

Общий синтаксис для RETURN следующий:

RETURN expression

Существует также вариант RETURN DISTINCT.

Выражение, возвращаемое RETURN, создается для каждой итерации в блоке, в котором находится оператор RETURN. Это означает, что результатом оператора RETURN всегда является массив. Он включает в себя пустой массив, если ни один документ не соответствует запросу, и единственное возвращаемое значение, возвращаемое как массив с одним элементом.

Чтобы вернуть все элементы из текущего итерируемого массива без изменений, можно использовать следующую простую форму:

FOR variableName IN expression
  RETURN variableName

Поскольку RETURN позволяет указать выражение, для вычисления элементов результата могут быть выполнены произвольные вычисления. Для вычислений могут быть использованы любые переменные, действующие в области видимости, в которой находится RETURN.

Использование

Чтобы перебрать все документы коллекции users и вернуть полные документы, вы можете написать:

1
2
FOR u IN users
  RETURN u

В каждой итерации цикла for-loop документ коллекции users присваивается переменной u и возвращается в этом примере в неизменном виде. Чтобы вернуть только один атрибут каждого документа, можно использовать другое выражение возврата:

1
2
FOR u IN users
  RETURN u.name

Или, чтобы вернуть несколько атрибутов, объект можно построить следующим образом:

1
2
FOR u IN users
  RETURN { name: u.name, age: u.age }

Примечание: RETURN закроет текущую область видимости и удалит все локальные переменные в ней. Это важно помнить при работе с подзапросами.

Также поддерживаются динамические имена атрибутов:

1
2
FOR u IN users
  RETURN { [ u._id ]: u.age }

Документ id каждого пользователя используется в качестве выражения для вычисления ключа атрибута в этом примере:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[
  {
    "users/9883": 32
  },
  {
    "users/9915": 27
  },
  {
    "users/10074": 69
  }
]

Результат содержит один объект для каждого пользователя с одной парой ключ/значение. Обычно это нежелательно. Для получения единого объекта, который сопоставляет идентификаторы пользователей с возрастами, отдельные результаты должны быть объединены и возвращены с помощью другого RETURN:

1
2
3
4
RETURN MERGE(
  FOR u IN users
    RETURN { [ u._id ]: u.age }
)
1
2
3
4
5
6
7
[
  {
    "users/10074": 69,
    "users/9883": 32,
    "users/9915": 27
  }
]

Следует помнить, что если ключевое выражение оценивает одно и то же значение несколько раз, только одна из пар ключ/значение с дублирующим именем сохранится MERGE(). Чтобы избежать этого, можно обойтись без динамических имен атрибутов, использовать вместо них статические имена и возвращать все свойства документа в качестве значений атрибутов:

1
2
FOR u IN users
  RETURN { name: u.name, age: u.age }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[
  {
    "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

RETURN DISTINCT не допускается на верхнем уровне запроса, если ему не предшествует цикл FOR.

Приведенный ниже пример возвращает ["foo", "bar", "baz"]:

1
2
FOR value IN ["foo", "bar", "bar", "baz", "foo"]
  RETURN DISTINCT value

RETURN DISTINCT не изменит порядок результатов, к которым он применяется, в отличие от COLLECT.

Если DISTINCT применяется к выражению, которое само является массивом или подзапросом, DISTINCT не делает значения в каждом результате массива или подзапроса уникальными, а гарантирует, что результат содержит только различные массивы или результаты подзапроса. Чтобы сделать результат массива или подзапроса уникальным, просто примените DISTINCT для массива или подзапроса.

Например, следующий запрос применит DISTINCT к результатам подзапроса, но не внутри подзапроса:

1
2
3
4
5
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
[[1, 2, 3, 4, 1, 3]]

Если целью является применение DISTINCT внутри подзапроса, его нужно переместить туда:

1
2
3
4
5
6
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],
  [1, 2, 3, 4]
]

Комментарии