2014-10-29 8 views
5

Wie kann ich meine Daten in ArangoDB mit AQL gruppieren? Zum Beispiel meine Struktur ist:ArangoDB Wie gilt 'Gruppieren nach' (COLLECT oder ...?)

[ 
    {name: "karl", id: "1", timestamp: "11112"}, 
    {name: "migele", id": "2", timestamp: "11114"}, 
    {name: "martina", id": "2", timestamp: "11116"}, 
    {name: "olivia", id": "3", timestamp: "11118"}, 
    {name: "sasha", id": "4", timestamp: "111120"}, 
] 

ich die Daten mit einer eindeutigen ID und den tatsächlichen Zeitstempel erhalten möchten:

{ 
    karl, 
    martina (because martina timestamp > migele timestamp and his ids is equals), 
    olivia, 
    sasha 
} 

Antwort

5

Zur Gruppe können Sie COLLECT verwenden:

FOR doc IN collection 
    COLLECT id = doc.id INTO g 
    RETURN { id: id, docs: LENGTH(g) } 

Dies liefert eine Liste mit eindeutigen IDs, und für jede eindeutige ID erhalten Sie die Anzahl der Dokumente mit der ID.

jetzt Um das Dokument mit in jeder Gruppe mit dem höchsten Wert in timestamp zu erhalten, müssen Sie zuerst jede Gruppe von Zeitstempeln sortieren:

FOR doc IN collection 
    COLLECT id = doc.id INTO g 
    LET names = (FOR value IN g[*].doc SORT value.timestamp DESC RETURN value.name) 
    RETURN names 

, schließlich nur das Element mit dem höchsten Zeitmarkenwert zu erhalten, Verwenden Sie names[0] (und Sie können auch eine LIMIT vorher anwenden, weil Sie nur an der ersten Position interessiert sein werden):

FOR doc IN collection 
    COLLECT id = doc.id INTO g 
    LET names = (FOR value IN g[*].doc SORT value.timestamp LIMIT 1 DESC RETURN value.name) 
    RETURN names[0]