Связывание параметров¶
AQL поддерживает использование параметров привязки, что позволяет отделить текст запроса от литеральных значений, используемых в запросе. Рекомендуется отделять текст запроса от литеральных значений, поскольку это предотвратит (злонамеренное) внедрение ключевых слов и других имен коллекций в существующий запрос. Эта инъекция была бы опасной, потому что она может изменить смысл существующего запроса.
Используя параметры связывания, нельзя изменить значение существующего запроса. Параметры привязки можно использовать везде в запросе, где можно использовать литералы.
Синтаксис¶
Общий синтаксис для параметров привязки: @name, где @ означает, что это параметр привязки значения, а name — фактическое имя параметра. Его можно использовать для замены значений в запросе.
1 | |
Для коллекций используется несколько иной синтаксис @@coll, где @@ означает, что это параметр привязки коллекции, а coll — это имя параметра.
1 2 | |
Ключевые слова и другие языковые конструкции не могут быть заменены значениями привязки, например FOR, FILTER, IN, INBOUND или вызовами функций.
Имена параметров привязки должны начинаться с любой из букв от a до z (верхний или нижний регистр) или цифры (от 0 до 9), за ними может следовать любая буква, цифра или символ подчеркивания.
Их нельзя заключать в кавычки в коде запроса:
1 2 | |
1 2 | |
Если вам нужно выполнить обработку строк (конкатенацию и т. д.) в запросе, вам нужно использовать строковые функции для этого:
1 2 3 | |
Использование¶
Простое использование¶
Значения параметра связывания необходимо передавать вместе с запросом при его выполнении, но не как часть самого текста запроса. В веб-интерфейсе рядом с редактором запросов есть панель, где можно ввести параметры привязки. Для приведенного ниже запроса появятся два поля ввода для ввода значений параметров id и name.
1 2 3 | |
При использовании db._query() (например, в arangosh) в качестве параметров можно передать объект пар ключ-значение. Такой объект также можно передать в конечную точку HTTP API _api/cursor в качестве значения атрибута для ключа bindVars:
1 2 3 4 5 6 7 | |
Параметры привязки, объявленные в запросе, также должны иметь значение параметра, иначе запрос завершится ошибкой. Указание параметров, не объявленных в запросе, также приведет к ошибке.
Вложенные атрибуты¶
Параметры привязки можно использовать как для записи через точку, так и для записи в квадратных скобках для доступа к податрибутам. Они также могут быть связаны:
1 2 3 4 5 | |
1 2 3 4 | |
Оба варианта в приведенном выше примере возвращают [ "baz" ] в качестве результата запроса.
Полный путь к атрибуту, в частности, для сильно вложенных данных, также можно указать с помощью записи через точку и одного параметра привязки, передав массив строк в качестве значения параметра. Элементы массива представляют ключи атрибутов пути:
1 2 | |
1 | |
Пример запроса возвращает [ 1 ] в качестве результата. Обратите внимание, что { "attr": "a.b.c" } вернет значение атрибута с именем a.b.c, а не значение атрибута c с родительскими элементами a и b, как [ "a", "b", "c" ].
Параметры привязки коллекции¶
Для внедрения имен коллекций существует специальный тип параметра привязки. Этот тип параметра связывания имеет имя с префиксом дополнительного символа @, поэтому @@name в запросе.
1 2 3 | |
Второй @ будет частью имени параметра привязки, что важно помнить при указании bindVars (обратите внимание на начальный @):
1 2 3 4 5 6 | |