2017-10-16 17 views
2

ArangoDB에는 'people'이라는 컬렉션이 있습니다. 각 사람은 이름과 국적을가집니다. 이름이 두 번 이상 나오고 미국인 인 모든 사람의 키를 찾으려면 어떻게합니까?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

처음에는 이름이 두 번 이상 나오는 사람을 얻는 쿼리가 나에게 효과적이지 않았습니다. 그것은으로 수정해야 : 그룹 AQL 쿼리하기 위해,

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 

그런 다음, 당신은 단지 서로의 뒤에 넣어 (중첩 된 쿼리로 생각) 할 수 있습니다. 이름 (예 : 그룹)을 사용하여 첫 번째 항목에서 선택하십시오. 단, 국적란이없는 경우에는 'KEEP KEY'를 삭제해야합니다.

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 명의 미국인 만 있다면이 두 미국인 만받습니다. 그리고 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