AQL:找到所有名字出现不止一次并且是美国人的人

AQL: Find all persons whose name occurs more than once and who are American

在 ArangoDB 中,我有一个集合 'people'。每个人都有姓名和国籍。 我如何找到所有名字出现不止一次的美国人的钥匙?

我可以运行 分别查询。 选择名字出现不止一次的所有人:

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

但我不知道如何将这两者结合起来。问题是我需要在 之后过滤国籍,检查名称是否不唯一(因为可能有美国 John Smith 和英国 John Smith)。 然而,COLLECT 语句创建了一个列表列表,我不知道如何正确过滤它。

起初,查询名字出现不止一次的人对我不起作用。需要修改为:

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 查询进行分组,您可以将它们放在彼此后面(将其视为嵌套查询)。和 select 从第一个使用名称(例如组)。但是您需要删除 'KEEP key',因为如果国籍字段不存在,您将无法从查询中 select。

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