2017-10-16 70 views
2

在ArangoDB中,我有一個'人員'集合。每個人都有一個名字和一個國籍。 我如何找到名字不止一次出現在美國人身上的所有人的鑰匙?AQL:查找所有名字多次出現並且是美國人的人

我可以分別運行這兩個查詢。 選擇所有的人的名字出現不止一次:

FOR p IN people 
LET key = p._key 
COLLECT p.name INTO groups KEEP key 
FILTER LENGTH(groups) >= 2 
LET group = groups[*].key 
RETURN group 

選擇誰是美國所有的人:

FOR p IN people 
FILTER p.nationality == 'American' 
RETURN p._key 

但我無法弄清楚如何將這兩者結合起來。問題是我需要在之後篩選國籍,檢查名稱是否是非唯一的(因爲可能有美國的約翰史密斯和英國的約翰史密斯)。 然而,COLLECT語句會創建一個列表清單,我無法弄清楚如何正確地過濾它。

回答

2

首先,查詢獲取名稱不止一次的人不適合我。它需要被修改爲:

FOR p IN people 
LET key = p._key 
COLLECT name = p.name INTO groups KEEP key 
FILTER LENGTH(groups) >= 2 
LET group = groups[*].key 
RETURN group 

然後,以組AQL查詢,你可以把他們在彼此的後面(認爲它是嵌套查詢)。並通過使用名稱(例如組)從第一個中選擇。但是您需要刪除'KEEP'鍵,因爲如果國籍字段不存在,您將無法從查詢中進行選擇。

FOR p IN people 
LET key = p._key 
COLLECT name = p.name INTO groups 
FILTER LENGTH(groups) >= 2 
    FOR p2 IN groups 
    FILTER p2.p.nationality == 'American' 
    RETURN p2 

這一個工作對我來說,如果有3約翰只有2美國人,我只得到這2名美國人。 而且,如果您只想返回nkey,請使用LET語句篩選必填字段。然後看起來像:

FOR p IN people 
    LET key = p._key 
    COLLECT name = p.name INTO groups 
    FILTER LENGTH(groups) >= 2 
    FOR p2 IN groups 
    FILTER p2.p.nationality == 'American' 
    LET key=p2.p._key 
    RETURN key 
相關問題