过滤Arango查询结果以报告AQL中的数组交集

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

我正在尝试使用ArangoDB替代我目前正在使用的Postgres。在Postgres中,我有一个表,zuffs包含带有以下格式的行

 hash       passes     visits   

 123        {1,2,4}   {2,3,4,5}

其中passesvisits均为int[]。为了建立passes访问的交集,我将写为

SELECT ARRAY
(
 SELECT UNNEST(a1) INTERSECT SELECT UNNEST(a2))
 FROM (SELECT passes AS a1,visits as a2 FROM zuffs where hash = 1) q;

哪个Postgres会强制执行以返回结果{2,4}

现在假设我在ArangoDB中具有以下zuffs的集合documents

{“ hash”:45,“ passs”:[1,2,3],“ visits”:[3,11,17]}

{“ hash”:76,“ passs”:[11,2],“ visits”:[3,4,17]}

{“ hash”:13,“ passs”:[11,21],“ visits”:[13,44,27]}

{“ hash”:7,“ passs”:[2],“ visits”:[4,67]}

我不清楚我将如何执行以下操作

  1. 为带有passes 45的文档建立visitshash的交点,I1
  2. 获得该结果并返回与上述求得的交点I2具有非空交点的同一集合中其他文档的哈希。

尽管我对ArangoDB感到非常满意,但我发现它有自己的查询语言,而不是仅使用所需的SQL超集,这很不幸。在这种情况下,我已经知道我将不得不以某种方式将FOR INFILTER一起使用,但是如何操作却一点儿也不明确。

json filter arangodb
1个回答
1
投票

作为一名SQL专家,我还反对AQL的语法差异。但是,实际上并没有变得那么难理解,这使得“学习”只是时间和使用的函数。

我确定还有其他方法可以执行此操作,但这是一个快速/肮脏的示例:

  1. 找到要匹配的文档,并得到它的交集产品
  2. 对于z中的每个文档zuffs,计算交点并寻找匹配项>>
  3. 返回匹配文件的hash
  4. LET match = (
        FOR z IN zuffs
            FILTER z.hash == 45
            FOR i IN INTERSECTION(z.passes, z.visits)
                RETURN i
    )
    FOR z IN zuffs
        LET i = INTERSECTION(z.passes, z.visits)
        FOR m IN match
            FILTER m IN i
                RETURN z.hash
    

返回:

[
  45
]

给出您的示例数据集,您将只取回一个符合要求的文档(45)。添加更多文档或将其他文档之一修改为具有公共相交将提供更有趣的结果。

注意事项:

  1. 从SQL移到AQL使您将思维从“行的集合”转移到“循环的”事物上。
  2. 跟踪返回(或本机)类型(数组与对象/字符串/等),并相应地处理每条数据(注意FOR i IN INTERSECTION...中的match)。
  3. 使用ExplainProfile按钮(或功能)查看查询的效果。考虑其他可以实现结果的方法,并尝试使其更快!
  4. 例如:

LET match = FIRST(
    FOR z IN zuffs
        FILTER z.hash == 45
        RETURN INTERSECTION(z.passes, z.visits)
)
FOR z IN zuffs
    FILTER LENGTH( INTERSECTION(match, INTERSECTION(z.passes, z.visits)) ) > 0
        RETURN z.hash

两个示例的match节均返回相同的结果(具有3单个值的数组),但是它们以不同的方式进行处理。而且我可以不使用FOR m IN match...,而是可以将本机数组函数与过滤器一起使用。实际上,第一个示例比第二个示例快得多,其原因在“解释”计划中显而易见。

我发现它非常

有助于熟悉high levelfunction文档。这两个地方几乎拥有成功使用AQL所需的一切(除了“大图”之类的东西,例如查询调整,索引编制等)。
© www.soinside.com 2019 - 2024. All rights reserved.