RETURN¶
Оператор RETURN
можно использовать для получения результата запроса. Обязательно указывать оператор RETURN
в конце каждого блока в запросе на выборку данных, иначе результат запроса будет неопределен. Использование RETURN
на основном уровне в запросах на модификацию данных необязательно.
Синтаксис¶
Общий синтаксис для RETURN
следующий:
RETURN expression
Существует также вариант RETURN DISTINCT
.
Выражение, возвращаемое RETURN
, создается для каждой итерации в блоке, в котором находится оператор RETURN
. Это означает, что результатом оператора RETURN
всегда является массив. Он включает в себя пустой массив, если ни один документ не соответствует запросу, и единственное возвращаемое значение, возвращаемое как массив с одним элементом.
Чтобы вернуть все элементы из текущего итерируемого массива без изменений, можно использовать следующую простую форму:
FOR variableName IN expression
RETURN variableName
Поскольку RETURN
позволяет указать выражение, для вычисления элементов результата могут быть выполнены произвольные вычисления. Для вычислений могут быть использованы любые переменные, действующие в области видимости, в которой находится RETURN
.
Использование¶
Чтобы перебрать все документы коллекции users и вернуть полные документы, вы можете написать:
1 2 |
|
В каждой итерации цикла for-loop документ коллекции users присваивается переменной u и возвращается в этом примере в неизменном виде. Чтобы вернуть только один атрибут каждого документа, можно использовать другое выражение возврата:
1 2 |
|
Или, чтобы вернуть несколько атрибутов, объект можно построить следующим образом:
1 2 |
|
Примечание: RETURN
закроет текущую область видимости и удалит все локальные переменные в ней. Это важно помнить при работе с подзапросами.
Также поддерживаются динамические имена атрибутов:
1 2 |
|
Документ id каждого пользователя используется в качестве выражения для вычисления ключа атрибута в этом примере:
1 2 3 4 5 6 7 8 9 10 11 |
|
Результат содержит один объект для каждого пользователя с одной парой ключ/значение. Обычно это нежелательно. Для получения единого объекта, который сопоставляет идентификаторы пользователей с возрастами, отдельные результаты должны быть объединены и возвращены с помощью другого RETURN
:
1 2 3 4 |
|
1 2 3 4 5 6 7 |
|
Следует помнить, что если ключевое выражение оценивает одно и то же значение несколько раз, только одна из пар ключ/значение с дублирующим именем сохранится MERGE(). Чтобы избежать этого, можно обойтись без динамических имен атрибутов, использовать вместо них статические имена и возвращать все свойства документа в качестве значений атрибутов:
1 2 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
RETURN DISTINCT
¶
За RETURN
по желанию может следовать ключевое слово DISTINCT
. Ключевое слово DISTINCT
обеспечивает уникальность значений, возвращаемых оператором RETURN
:
FOR variableName IN expression
RETURN DISTINCT expression
RETURN DISTINCT
не допускается на верхнем уровне запроса, если ему не предшествует цикл FOR
.
Приведенный ниже пример возвращает ["foo", "bar", "baz"]
:
1 2 |
|
RETURN DISTINCT
не изменит порядок результатов, к которым он применяется, в отличие от COLLECT
.
Если DISTINCT
применяется к выражению, которое само является массивом или подзапросом, DISTINCT
не делает значения в каждом результате массива или подзапроса уникальными, а гарантирует, что результат содержит только различные массивы или результаты подзапроса. Чтобы сделать результат массива или подзапроса уникальным, просто примените DISTINCT
для массива или подзапроса.
Например, следующий запрос применит DISTINCT
к результатам подзапроса, но не внутри подзапроса:
1 2 3 4 5 |
|
Здесь у нас будет цикл FOR
с двумя итерациями, каждая из которых выполняет подзапрос. Здесь DISTINCT
применяется к результатам двух подзапросов. Оба подзапроса возвращают одно и то же значение результата (то есть [ 1, 2, 3, 4, 1, 3 ]
), поэтому после DISTINCT
останется только одно вхождение значения [ 1, 2, 3, 4, 1, 3 ]
:
1 |
|
Если целью является применение DISTINCT
внутри подзапроса, его нужно переместить туда:
1 2 3 4 5 6 |
|
В приведенном выше случае DISTINCT
сделает результаты подзапроса уникальными, так что каждый подзапрос вернет уникальный массив значений ([ 1, 2, 3, 4 ]
). Поскольку подзапрос выполняется дважды и на верхнем уровне нет DISTINCT
, этот массив будет возвращен дважды:
1 2 3 4 |
|