[英]Filtering Arango query results to report an array intersection in AQL
我正在嘗試使用 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}
。
現在假設我在zuffs
中有 zuffs 集合,其中包含以下documents
{“哈希”:45,“通過”:[1,2,3],“訪問”:[3,11,17]}
{“哈希”:76,“通過”:[11,2],“訪問”:[3,4,17]}
{“哈希”:13,“通過”:[11,21],“訪問”:[13,44,27]}
{“哈希”:7,“通過”:[2],“訪問”:[4,67]}
我不清楚我將如何執行以下操作
hash
45 的文檔建立passes
和visits
的交集I1 。 雖然我很喜歡 ArangoDB,但不幸的是它有自己的查詢語言,而不是僅僅使用所需的 SQL 超集。 在這種情況下,我發現我將不得不以某種方式將FOR IN
與FILTER
一起使用,但我完全不清楚如何使用。
作為一名 SQL 專家,我也曾與 AQL 的語法差異作過斗爭。 然而,它最終並沒有變得那么難懂,這使得“學習”只是時間和使用的函數。
我敢肯定還有其他方法可以做到這一點,但這是一個快速/骯臟的例子:
zuffs
中的每個文檔z
,計算交集並查找匹配項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)。 添加更多文檔或修改其他文檔之一以具有共同交集將提供更有趣的結果。
要記住的事情:
match
中的FOR i IN INTERSECTION...
)。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...
,我可以使用帶有過濾器的本機數組函數。 實際上,第一個示例比第二個示例快得多,原因在“解釋”計划中顯而易見。
我發現熟悉高級和功能文檔非常有幫助。 這兩個地方將包含您成功使用 AQL 所需的幾乎所有內容(除了查詢調優、索引等“大局”內容之外)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.