Перейти к содержанию

FILTER

Оператор FILTER можно использовать для ограничения результатов элементами, которые соответствуют произвольному логическому условию.

Синтаксис

FILTER expression

expression должно быть условием, которое оценивается как false или true.

Использование

Если результат условия равен false, текущий элемент пропускается, поэтому он не будет обрабатываться дальше и не станет частью результата. Если условие истинно, то текущий элемент не пропускается и может быть обработан дальше.

Список операторов сравнения, логических операторов и т.д., которые можно использовать в условиях, см. в разделе Операторы.

1
2
3
FOR u IN users
  FILTER u.active == true && u.age < 39
  RETURN u

В запросе разрешается указывать несколько операторов FILTER, даже в одном и том же блоке. Если используется несколько операторов FILTER, их результаты будут объединены логическим AND, то есть все условия фильтра должны быть истинными, чтобы включить элемент.

1
2
3
4
FOR u IN users
  FILTER u.active == true
  FILTER u.age < 39
  RETURN u

В приведенном выше примере все элементы массива users, имеющие атрибут active со значением true и атрибут age со значением меньше 39 (включая null), будут включены в результат. Все остальные элементы users будут пропущены и не будут включены в результат, выдаваемый RETURN.

Описание влияния несуществующих или нулевых атрибутов см. в Accessing Data from Collections.

Хотя FILTER обычно используется в комбинации с FOR, он также может использоваться на верхнем уровне или в подзапросах без окружающего цикла FOR.

1
2
FILTER false
RETURN ASSERT(false, "never reached")

Порядок операций

Обратите внимание, что позиции операторов FILTER могут влиять на результат запроса. Например, в тестовых данных 16 активных пользователей:

1
2
3
FOR u IN users
  FILTER u.active == true
  RETURN u

Мы можем ограничить набор результатов максимум 5 пользователями:

1
2
3
4
FOR u IN users
  FILTER u.active == true
  LIMIT 5
  RETURN u

Это может вернуть документы пользователей, например, Джима, Диего, Энтони, Майкла и Хлои. Какие из них будут возвращены, не определено, так как нет оператора SORT для обеспечения определенного порядка. Если мы добавим второй оператор FILTER, чтобы вернуть только женщин...

1
2
3
4
5
FOR u IN users
  FILTER u.active == true
  LIMIT 5
  FILTER u.gender == "f"
  RETURN u

... он может просто вернуть документ Chloe, потому что LIMIT применяется перед вторым FILTER. Во второй блок FILTER попадает не более 5 документов, и не все из них удовлетворяют критерию пола, даже если в коллекции более 5 активных пользователей женского пола. Более детерминированного результата можно добиться, добавив блок SORT:

1
2
3
4
5
6
FOR u IN users
  FILTER u.active == true
  SORT u.age ASC
  LIMIT 5
  FILTER u.gender == "f"
  RETURN u

Это вернет пользователей Mariah, Mary и Isabella. Если отсортировать по возрасту в порядке DESC, то будут возвращены документы Sophia и Emma. Однако FILTER после LIMIT не очень распространен, и вам, вероятно, нужен такой запрос:

1
2
3
4
5
FOR u IN users
  FILTER u.active == true AND u.gender == "f"
  SORT u.age ASC
  LIMIT 5
  RETURN u

Значение места размещения блоков FILTER позволяет этому единственному ключевому слову брать на себя роль двух ключевых слов SQL, WHERE и HAVING. Таким образом, FILTER в AQL работает с агрегатами COLLECT так же, как и с любым другим промежуточным результатом, атрибутом документа и т.д.

Комментарии