2016-08-22 5 views
0

Meine Webanwendung muss mehrere sortierte Listen von Dokumentattributen in einem Diagramm anzeigen. Diese sind hours, cycles und age.Mehrfachsortierung in ArangoDB

Ich habe eine AQL-Abfrage, die das Diagramm schön durchquert und mir alle Daten, die meine App benötigt, in 2 ms erhält. Ich bin sehr beeindruckt! Aber ich muss es für jeden Graphen sortiert haben. Die Abfrage gibt derzeit ein Array von JSON-Objekten zurück, die alle drei Attribute und die ID enthalten, für die sie gelten. Genial. Die Abfrage sortiert auch sehr leicht nach einem der Attribute.

Mein Problem ist: Ich muss eine sortierte Liste aller drei haben, und möchte nicht die Datenbank dreimal abfragen, da die Daten alle in den gleichen Dokumenten meine Traversal zurückgegeben wird.

würde Ich mag drei sortierten Arrays von JSON-Objekte zurück: ein hours und die ID enthält, eine, die cycles und die ID und ein age und die ID enthält. Auf diese Weise können meine Diagramme alle drei Diagramme ohne clientseitige Sortierung anzeigen.

HTTP-Anfragen selbst sind zeitraubend, obwohl die Datenbank sehr schnell ist, weshalb ich alle drei auf einmal ziehen möchte, da die Daten selbst klein sind.

Meine aktuelle Abfrage ist ein einfacher Graph Traversal:

for v, e, p in outbound startNode graph 'myGraph' 
    filters & definitions... 
    sort v.hours desc 
    return {"hours": v.hours, "cycles": v.cycles, "age": v.age, "id": v.id} 

Gibt es eine einfache Weise, die ich sagen kann, Arango mir diese Struktur zurück?

{ 
[ 
    { 
    "id": 47, 
    "hours": 123 
    }, 
    { 
    "id": 23, 
    "hours": 105 
    }... 
], 
[ 
    { 
    "id": 47, 
    "cycles": 18 
    }, 
    { 
    "id": 23, 
    "cycles": 5 
    }... 
], 
[ 
    { 
    "id": 47, 
    "age": 4.2 
    }, 
    { 
    "id": 23, 
    "age": 0.9 
    } 
] 
} 

Obwohl die Traversal ist schnell, ich würde es vorziehen, wenn ich nicht wieder Traverse habe die graphische Darstellung dreimal, es zu tun, wenn möglich.

Antwort

1

Meine Lösung:

let data = (for v, e, p in outbound startNode graph 'myGraph' 
       filters & definitions... 
       return {"hours": v.hours, "cycles": v.cycles, "age": v.age, "id": v.id}) 
let byHours = (for thing in data 
        sort thing.hours desc 
        return {"hours": thing.hours, "id": thing.id}) 
let byCycles = (for thing in data 
        sort thing.cycles desc 
        return {"cycles": thing.cycles, "id": thing.id}) 
let byAge = (for thing in data 
       sort thing.age desc 
       return {"age": thing.age, "id": thing.id}) 
return {"hours": byHours, "cycles": byCycles, "age": byAge} 
+0

Sie könnten nach Stunden nach 'data' sortieren, also haben Sie nicht die Traversal und 3 Sub-Abfragen für die Sortierung, sondern nur eine Traversal mit einer Sortierung, plus 2 Sub-Abfragen für unterschiedliche Sortierreihenfolge. Es macht nicht viel Unterschied, obwohl ich denke. – CoDEmanX

+0

Ich denke, dass wäre schneller, da die Stunden, Zyklen und Alter Sortierungen sehr ähnlich sind. Das Sortieren aus der willkürlichen Reihenfolge dreimal scheint, als würde es länger dauern. –

+0

Okay, ich habe es auch so versucht. Die Art und Weise, wie ich oben beschrieben habe, dauert 3 ms und wird um Stunden vorsortiert, dann dauert das Sortieren der Zyklen und das Altern basierend auf der vorsortierten Liste 5 ms. Ich habe das nicht erwartet, aber die Art ist bei dieser Optimierung tatsächlich langsamer. –

1

Ich bin nicht sicher, wie diese gegen Ihre Lösung Performance-weise vergleichen, aber die naheliegendste Lösung wäre einmal zu durchqueren und dann drei sortierten Ergebnisse wie folgt erstellen:

LET nodes = (
    FOR v, e, p IN OUTBOUND startNode GRAPH 'myGraph' 
    FILTER ... 
    RETURN v 
) 
RETURN { 
    hours: (
    FOR n IN nodes 
    SORT n.hours DESC 
    RETURN KEEP(n, ['hours', 'id']) 
), 
    cycles: (
    FOR n IN nodes 
    SORT n.cycles DESC 
    RETURN KEEP(n, ['cycles', 'id']) 
), 
    age: (
    FOR n IN nodes 
    SORT n.age DESC 
    RETURN KEEP(n, ['age', 'id']) 
) 
} 

Dies würde die Grafik nur einmal durchqueren, aber das Ergebnis dreimal sortieren.