COLLECT
은 버킷에 레코드를 정렬하고 버킷에있는 레이블 만 가져옵니다. 필요에 따라 각 문서의 수를 반환 할 수도 있습니다. 동일한 범위에있는 다른 모든 항목은 삭제됩니다 (예 : v
및 e
). 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 코드가 더 많을 것이며, 아마도 더 나쁜 성능을 보일 것입니다.