2017-10-16 95 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 
相关问题