2016-08-15 6 views
1

동일한 그룹 이름에서 가장 오래된 날짜의 정점 개체를 나열하려고합니다. 나는 COLLECT 사용하려고 시도하는 골재 해요 :ArangoDB 그룹 객체 데이터 (AQL)

FOR v,e IN 1..2 OUTBOUND obj.id 
     GRAPH 'CollectionGraph' 
     COLLECT groupName = v.groupName 
     AGGREGATE minDate = MIN(v.date) 
     RETURN {groupName, minDate} 

이 쿼리합니다 (MIN 기능이 작동하는 내가 의도했던 방식으로 작동한다고 가정) 그냥 그룹 이름과 날짜를 반환합니다. 그룹 이름을 기반으로 그룹화하고 초기 날짜 기준을 사용하여 전체 정점 개체를 실제로 얻는 방법을 확신 할 수 없습니다.

답변

3

COLLECT은 버킷에 레코드를 정렬하고 버킷에있는 레이블 만 가져옵니다. 필요에 따라 각 문서의 수를 반환 할 수도 있습니다. 동일한 범위에있는 다른 모든 항목은 삭제됩니다 (예 : ve). FOR 루프/순회 옆에 정의 된 변수는 COLLECT 이후에도 계속 액세스 할 수 있습니다.

각 버킷의 내부 내용을 알고 싶다면 대체 구문
COLLECT ... INTO ...을 사용해야합니다. 주로 성능 튜닝을 위해 여러 가지 변형이 있습니다. 그러나의 기본적인 변형에 충실하자

FOR v, e IN 1..2 OUTBOUND obj.id GRAPH 'CollectionGraph' 
    COLLECT group = v.groupName INTO groups 
    RETURN (
     FOR g IN groups 
      SORT g.v.date 
      LIMIT 1 
      RETURN g 
    ) 

group이 예에서는 사용하지 않지만이 구문이 필요합니다. groups 그러나 버킷이 떨어진 곳은 INTO입니다. 이를 사용하여 date 속성을 기반으로 각 그룹을 정렬하고 첫 번째 문서를 반환 할 수 있습니다.

참고 : RETURN ()이 없으면 LIMIT 1은 바깥 쪽 FOR 루프에 영향을 미치며 전체 쿼리는 오직 하나의 문서 만 반환합니다. 이는 우리가 원하는 것이 아닙니다. 하위 쿼리를 사용하면 새 범위가 만들어지고이 제한이 "내부"루프에 적용됩니다.

당신은뿐만 아니라 다른 방법으로 문제를 해결할 수 :

FOR v, e IN 1..2 OUTBOUND obj.id GRAPH 'CollectionGraph' 
    COLLECT group = v.groupName 
    AGGREGATE minDate = MIN(v.date) 
    RETURN (
     FOR doc IN yourCollection 
      FILTER doc.groupName == group AND doc.date == minDate 
      LIMIT 1 
      RETURN doc 
    ) 

그룹은 각 그룹에서 가장 빠른 날짜뿐만 아니라 결정된다. 그런 다음 그룹 이름과 날짜를 사용하여 컬렉션 yourCollection을 필터링하고 하나의 문서가 반환됩니다. 단점은 단 하나의 콜렉션 만 (효율적으로) 스캔 할 수 있지만 순회는 여러 콜렉션의 문서를 제공 할 수 있다는 점입니다. 어떤 컬렉션을 검사해야하는지 알고 있다면 각 컬렉션에 대한 하위 쿼리를 작성한 다음 결과를 결합 할 수 있습니다. 위에 주어진 첫 번째 쿼리와 비교할 때, AQL 코드가 더 많을 것이며, 아마도 더 나쁜 성능을 보일 것입니다.