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 | |