簡體   English   中英

過濾 Arango 查詢結果以報告 AQL 中的數組交集

[英]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}

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}

現在假設我在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]}

我不清楚我將如何執行以下操作

  1. 為帶有hash 45 的文檔建立passesvisits的交集I1
  2. 獲取該結果並返回同一集合中與上面獲得的交集I2具有非空交集的其他文檔的哈希值。

雖然我很喜歡 ArangoDB,但不幸的是它有自己的查詢語言,而不是僅僅使用所需的 SQL 超集。 在這種情況下,我發現我將不得不以某種方式將FOR INFILTER一起使用,但我完全不清楚如何使用。

作為一名 SQL 專家,我也曾與 AQL 的語法差異作過斗爭。 然而,它最終並沒有變得那么難懂,這使得“學習”只是時間和使用的函數。

我敢肯定還有其他方法可以做到這一點,但這是一個快速/骯臟的例子:

  1. 找到你要匹配的文檔,得到它的交集
  2. 對於zuffs中的每個文檔z ,計算交集並查找匹配項
  3. 返回匹配文檔的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)。 添加更多文檔或修改其他文檔之一以具有共同交集將提供更有趣的結果。

要記住的事情:

  1. 從 SQL 轉移到 AQL 會使您的思維從“集合”(行)轉移到“循環”(對事物)。
  2. 跟蹤返回(或本機)類型(數組與對象/字符串/等),並相應地處理每條數據(注意match中的FOR i IN INTERSECTION... )。
  3. 使用ExplainProfile按鈕(或功能)查看查詢的執行情況。 想想其他可以完成結果的方法,並嘗試使其更快!

例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM