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

时间:2019-03-11 13:32:47

标签: arangodb aql

我想进行一个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 :(得分:0)

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

是我能想到的最快的

答案 1 :(得分:0)

我认为,对于具有类似结构的通用选择查询,最好的实现方法是

  

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。