我正在尝试使用ArangoDB替代我目前正在使用的Postgres。在Postgres中,我有一个表,zuffs
包含带有以下格式的行
hash passes visits
123 {1,2,4} {2,3,4,5}
其中passes
和visits
均为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]}
我不清楚我将如何执行以下操作
passes
45的文档建立visits
和hash
的交点,I1。尽管我对ArangoDB感到非常满意,但我发现它有自己的查询语言,而不是仅使用所需的SQL超集,这很不幸。在这种情况下,我已经知道我将不得不以某种方式将FOR IN
与FILTER
一起使用,但是如何操作却一点儿也不明确。
作为一名SQL专家,我还反对AQL的语法差异。但是,实际上并没有变得那么难理解,这使得“学习”只是时间和使用的函数。
我确定还有其他方法可以执行此操作,但这是一个快速/肮脏的示例:
z
中的每个文档zuffs
,计算交点并寻找匹配项>>hash
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)。添加更多文档或将其他文档之一修改为具有公共相交将提供更有趣的结果。
注意事项:
FOR i IN INTERSECTION...
中的match
)。Explain
和Profile
按钮(或功能)查看查询的效果。考虑其他可以实现结果的方法,并尝试使其更快!例如:
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 level和function文档。这两个地方几乎拥有成功使用AQL所需的一切(除了“大图”之类的东西,例如查询调整,索引编制等)。