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 так же, как и с любым другим промежуточным результатом, атрибутом документа и т.д.