如何检查 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。
我想进行 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。