FILTER¶
Оператор FILTER
можно использовать для ограничения результатов элементами, которые соответствуют произвольному логическому условию.
Синтаксис¶
FILTER expression
expression должно быть условием, которое оценивается как false
или true
.
Использование¶
Если результат условия равен false, текущий элемент пропускается, поэтому он не будет обрабатываться дальше и не станет частью результата. Если условие истинно, то текущий элемент не пропускается и может быть обработан дальше.
Список операторов сравнения, логических операторов и т.д., которые можно использовать в условиях, см. в разделе Операторы.
1 2 3 |
|
В запросе разрешается указывать несколько операторов FILTER
, даже в одном и том же блоке. Если используется несколько операторов FILTER
, их результаты будут объединены логическим AND
, то есть все условия фильтра должны быть истинными, чтобы включить элемент.
1 2 3 4 |
|
В приведенном выше примере все элементы массива users
, имеющие атрибут active
со значением true
и атрибут age
со значением меньше 39
(включая null
), будут включены в результат. Все остальные элементы users
будут пропущены и не будут включены в результат, выдаваемый RETURN
.
Описание влияния несуществующих или нулевых атрибутов см. в Accessing Data from Collections.
Хотя FILTER
обычно используется в комбинации с FOR
, он также может использоваться на верхнем уровне или в подзапросах без окружающего цикла FOR
.
1 2 |
|
Порядок операций¶
Обратите внимание, что позиции операторов FILTER
могут влиять на результат запроса. Например, в тестовых данных 16 активных пользователей:
1 2 3 |
|
Мы можем ограничить набор результатов максимум 5 пользователями:
1 2 3 4 |
|
Это может вернуть документы пользователей, например, Джима, Диего, Энтони, Майкла и Хлои. Какие из них будут возвращены, не определено, так как нет оператора SORT
для обеспечения определенного порядка. Если мы добавим второй оператор FILTER
, чтобы вернуть только женщин...
1 2 3 4 5 |
|
... он может просто вернуть документ Chloe, потому что LIMIT
применяется перед вторым FILTER
. Во второй блок FILTER
попадает не более 5 документов, и не все из них удовлетворяют критерию пола, даже если в коллекции более 5 активных пользователей женского пола. Более детерминированного результата можно добиться, добавив блок SORT
:
1 2 3 4 5 6 |
|
Это вернет пользователей Mariah, Mary и Isabella. Если отсортировать по возрасту в порядке DESC
, то будут возвращены документы Sophia и Emma. Однако FILTER
после LIMIT
не очень распространен, и вам, вероятно, нужен такой запрос:
1 2 3 4 5 |
|
Значение места размещения блоков FILTER
позволяет этому единственному ключевому слову брать на себя роль двух ключевых слов SQL, WHERE
и HAVING
. Таким образом, FILTER
в AQL работает с агрегатами COLLECT
так же, как и с любым другим промежуточным результатом, атрибутом документа и т.д.