Как проверить, не является ли запрос ArangoDB пустым? - PullRequest
0 голосов
/ 11 марта 2019

Я хотел бы сделать exists запрос PostgreSQL.

Допустим, у меня есть Q запрос ArangoDB (AQL). Как я могу проверить, возвращает ли Q какой-либо результат?

Пример:

Q = "For u in users FILTER 'x@example.com' = u.email"

Каков наилучший способ сделать это (наиболее эффективный)?

У меня есть идеи, но я не смог найти простой способ измерить производительность:

Идея 1: использование Length:

RETURN LENGTH(%Q RETURN 1) > 0

Идея 2: использование Frist:

RETURN First(%Q RETURN 1) != null

Выше %Q является заменой для запроса, определенного в начале.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

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

Q = "Для вас в пользователях FILTER 'x@example.com' = u.email"

- сначала добавить предложение LIMIT к запросу и только заставить его возвращать постоянное значение (в отличие от полного документа).

Например, следующий запрос возвращает одно совпадение, если такой документ существует, или пустой массив, если совпадения нет:

FOR u IN users FILTER 'x@example.com' == u.email LIMIT 1 RETURN 1

(обратите внимание, что я также изменил оператор с = на ==, поскольку в противном случае запрос не будет проанализирован).

Обратите внимание, что этот запрос может принести большую пользу от создания индекса для атрибута поиска, т.е. email. Без индекса запрос будет выполнять полное сканирование коллекции и останавливаться на первом совпадении, тогда как с индексом он будет считывать не более одной записи индекса.

Наконец, чтобы ответить на ваш вопрос, шаблон для EXISTS -подобного запроса станет

LENGTH(%Q LIMIT 1 RETURN 1)

или уточнено в примере запроса:

LENGTH(FOR u IN users FILTER 'x@example.com' == u.email LIMIT 1 RETURN 1)

LENGTH(...) вернет количество совпадений, которое в этом случае будет либо 0, либо 1. И это также может быть использовано в условиях фильтрации, таких как:

FOR ....
  FILTER LENGTH(...)
  RETURN ...

потому что LENGTH(...) будет либо 0, либо 1, что в контексте условия FILTER будет равно false или true.

0 голосов
/ 13 марта 2019

Вам нужно решение AQL?

Только счет:

var q  = "For u in users FILTER 'x@example.com' = u.email";
var res = db._createStatement({query: q, count: true}).execute();
var ct = res.count();

Самый быстрый, о котором я могу думать.

...