【问题标题】:How to check if ArangoDB query is not empty?如何检查 ArangoDB 查询是否为空?
【发布时间】:2019-03-11 13:32:47
【问题描述】:

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

【问题讨论】:

  • 试试这个:LET Q = (FOR u IN users FILTER @email == u.email)) RETURN { email_found: LENGTH(Q) > 0 ? true : false } 并发送包含要搜索的电子邮件的参数@email

标签: arangodb aql


【解决方案1】:

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

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

就是先给查询增加一个LIMIT子句,只让它返回一个常量值(相对于完整的文档)。

例如,如果存在这样的文档,则以下查询返回单个匹配项,如果没有匹配项,则返回空数组:

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

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

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

最后,为了回答您的问题,EXISTS-like 查询的模板将变为

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。

【讨论】:

    【解决方案2】:

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

    是我能想到的最快的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多