2016-08-22 4 views
0

내 webapp는 문서 속성의 여러 정렬 된 목록을 그래프로 표시해야합니다. 이들은 hours, cyclesage입니다.ArangoDB의 다중 정렬

그래프를 아름답게 가로 지르는 AQL 쿼리를 사용하여 2ms 내에 모든 데이터가 필요합니다. 나는 감동했다! 하지만 각 그래프별로 정렬해야합니다. 쿼리는 현재 세 개의 속성과 ID가 모두 적용되는 json 객체의 배열을 반환합니다. 굉장해. 쿼리는 속성 중 하나에서 매우 쉽게 정렬됩니다.

내 문제는 : 세 가지 모두 정렬 된 목록이 있어야하며 데이터가 모두 내 문서가 반환 된 동일한 문서에 있기 때문에 데이터베이스를 세 번 쿼리하지 않는 것이 좋습니다. 하나는 cycles과 ID 및 age 및 ID를 포함하는 하나를 포함하는, hours를 포함 하나는 ID :

내가 JSON 객체의 세 가지 정렬 된 배열을 반환하고 싶습니다. 이렇게하면 내 그래프는 클라이언트 측 정렬없이 세 그래프를 모두 쉽게 표시 할 수 있습니다.

데이터베이스가 매우 빠름에도 불구하고 HTTP 요청 자체는 많은 시간을 필요로하므로 데이터 자체가 작기 때문에이 세 가지 모두를 한 번에 가져오고 싶습니다.

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} 

내가 아란 나에게이 구조를 반환 말할 수있는 쉬운 방법이 있나요 :

내 현재 질의는 간단한 그래프 탐색입니까?

{ 
[ 
    { 
    "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 
    } 
] 
} 

가능한 빨리 탐색을 수행하지만 가능하면 그래프를 3 번 ​​다시 탐색하지 않아도됩니다.

답변

1

내 솔루션 :

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

'데이터'에 대해 시간 단위로 정렬 할 수 있으므로 정렬을위한 순회 및 하위 쿼리는 없지만 정렬이있는 순회는 하나 뿐이지 만 다른 정렬 순서는 두 개의 하위 쿼리가 있습니다. 내가 추측하지만 그것은별로 다르지 않다. – CoDEmanX

+0

시간,주기 및 나이 정렬 순서가 매우 유사하기 때문에 더 빠를 것이라고 생각합니다. 임의 순서로 세 번 정렬하면 시간이 오래 걸리는 것처럼 보입니다. –

+0

좋아요, 나는 그렇게하려고했습니다. 위의 방법으로 3ms가 소요되고 몇 시간 씩 선점 한 다음 미리 정렬 된 목록을 기준으로주기와 나이를 정렬하는 데 5ms가 걸립니다. 나는 그것을 기대하지는 않았지만, 정렬은이 최적화로 실제로 더 느립니다. –

1
나는이 솔루션 성능 현명한에 대해 비교하는 방법을 모르겠어요

있지만, 가장 확실한 해결책은 한 번 통과 한 다음과 같은 세 가지 정렬 된 결과를 생성하는 것입니다 :

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']) 
) 
} 

그래프를 한 번만 탐색하지만 결과를 세 번 정렬 할 수 있습니다.