AQL:查找名称不止一次且美国人的所有人

时间:2017-10-16 14:14:25

标签: arangodb aql

在ArangoDB中,我有一个'人'系列。每个人都有姓名和国籍。 如何查找姓名不止一次且谁是美国人的所有人的钥匙?

我可以单独运行两个查询。 选择名称出现多次的所有人:

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语句会创建一个列表列表,我无法弄清楚如何正确过滤它。

1 个答案:

答案 0 :(得分: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