2017-10-01 4 views
2

Sagen, ich habe folgende Dokumente:AQL - Finden Sie Dokumente mit nicht eindeutigen Attributen in ArangoDB

{"_key": "1", "name": "George Washington"} 
{"_key": "2", "name": "George Washington"} 
{"_key": "3", "name": "John Adams"} 
{"_key": "4", "name": "Thomas Jefferson"} 
{"_key": "5", "name": "George Washington"} 
{"_key": "6", "name": "Thomas Jefferson"} 

Ich möchte eine AQL-Anweisung schreiben, der die Schlüssel des Dokuments nach Namen gruppiert zurückgibt, aber nur, wenn der Name tritt mehr als einmal auf.

Also meine gewünschte Ausgabe ist:

[["1", "2", "5"], ["4", "6"]] 

Bisher habe ich mit

FOR doc IN documents 
    LET key = doc._key 
    COLLECT name = doc.name INTO groups KEEP key 
    RETURN (FOR g IN groups RETURN g["key"]) 

kommen diese zurück:

[["1", "2", "5"], ["3"], ["4", "6"]] 

Wie kann ich den AQL-Befehl ändern, um bekomme nur Arrays mit zwei oder mehr Einträgen?

Antwort

0

Eine weitere Möglichkeit (möglicherweise etwas effizienter, da keine Unterabfrage beteiligt ist):

FOR doc IN documents 
    LET key = doc._key  
    COLLECT name = doc.name INTO groups KEEP key 
    LET keys = groups[*].key 
    FILTER LENGTH(keys) > 1 
    RETURN keys 
+0

Danke, das so gut funktioniert. Ich habe beide Abfragen (mit einem zusätzlichen LIMIT 1000) auf meinem ursprünglichen Datensatz getestet, der etwa 4,5 Millionen Dokumente enthält. Meine Anfrage dauerte 70 Sekunden, Ihre 60! –

0

es gelöst:

FOR doc IN documents 
    LET key = doc._key 
    COLLECT name = doc.name INTO groups KEEP key 
    LET groups2 = (FOR group IN groups RETURN group["key"]) 
    FILTER LENGTH(groups2) >= 2 
    RETURN groups2 
Verwandte Themen