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

问题描述 投票:0回答:2

我想做一个exists PostgreSQL查询。

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

例:

Q = "For u in users FILTER '[email protected]' = u.email"

What is the best way to do it (most performant)?

我有想法,但找不到一种简单的方法来衡量绩效:

想法1:使用Length

RETURN LENGTH(%Q RETURN 1) > 0

想法2:使用Frist

RETURN First(%Q RETURN 1) != null

在上面,%Q是开头定义的查询的替代。

arangodb aql
2个回答
0
投票

我认为对于具有类似结构的通用选择查询来实现此目的的最佳方法

Q =“对于你在用户FILTER'[email protected]'= u.email”

是首先向查询添加LIMIT子句,并且只返回一个常量值(与完整文档相反)。

例如,如果存在此类文档,则以下查询将返回单个匹配;如果没有匹配,则返回空数组:

FOR u IN users FILTER '[email protected]' == u.email LIMIT 1 RETURN 1

(请注意,我还将运算符从=更改为==,否则查询将无法解析)。

请注意,通过在搜索属性上创建索引(即email),此查询可能会从中受益匪浅。如果没有索引,查询将执行完整的集合扫描并在第一个匹配时停止,而对于索引,它将只读取一个索引条目。

最后,为了回答你的问题,EXISTS式查询的模板将成为

LENGTH(%Q LIMIT 1 RETURN 1)

或通过示例查询充实:

LENGTH(FOR u IN users FILTER '[email protected]' == u.email LIMIT 1 RETURN 1)

LENGTH(...)将返回匹配数,在这种情况下将为0或1.并且它也可以用于过滤条件,如下所示

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

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


0
投票

你需要和AQL解决方案吗?

只计数:

var q  = "For u in users FILTER '[email protected]' = u.email";
var res = db._createStatement({query: q, count: true}).execute();
var ct = res.count();

是我能想到的最快的。

© www.soinside.com 2019 - 2024. All rights reserved.