如何检查 ArangoDB 查询是否不为空?

How to check if ArangoDB query is not empty?

我想进行 exists PostgreSQL 查询。

假设我有一个 Q ArangoDB 查询 (AQL)。我如何检查 Q returns 是否有任何结果?

示例:

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是对开头定义的查询的替换。

您需要 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();

是我能想到的最快的了。

我认为对于具有类似

结构的通用选择查询来说,实现此目的的最佳方式

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

是先在查询中加入一个LIMIT子句,只使return为常量值(与全文对比)。

例如,以下查询 return 如果有这样的文档,则为单个匹配项;如果没有匹配项,则为空数组:

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(...) 将 return 匹配的数量,在这种情况下将是 0 或 1。它也可以用于过滤条件,如下所示

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

因为 LENGTH(...) 将是 0 或 1,在 FILTER 条件的上下文中将计算为 false 或 true。