2017-10-16 6 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キーを削除する必要があります。なぜなら、国籍フィールドが存在しなければ、クエリから選択することができないからです。

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 
関連する問題