집계
애그리게이션 클래스는 집계 파이프라인 단계 를 빌드 하는 정적 팩토리 메서드를 제공합니다. 각 메서드는 Bson
유형의 인스턴스 를 반환하며, 이 인스턴스는 MongoCollection.aggregate()
메서드로 전달될 수 있습니다.
다음 코드와 같이 Aggregates
클래스의 메서드를 정적으로 가져올 수 있습니다.
import org.mongodb.scala.model.Aggregates._
이 가이드의 예제에서는 이러한 정적 가져오기를 가정합니다.
match
$match
파이프라인 단계는 지정된 필터하다 와 일치하는 모든 문서를 다음 단계로 전달합니다. 필터하다 는 Bson
을 구현하는 모든 클래스의 인스턴스 가 될 수 있지만 Filters 클래스의 메서드를 사용하는 것이 편리합니다.
다음 예에서는 author
필드 값이 "Dave"
인 모든 문서와 일치하는 파이프라인 단계를 만듭니다.
`match`(equal("author", "Dave"))
참고
match
은 Scala 에서 예약어이고 역따옴표로 이스케이프되어야 하므로 filter()
별칭을 사용하는 것이 나을 수 있습니다.
filter(equal("author", "Dave"))
프로젝트
$project
파이프라인 단계는 모든 문서의 프로젝션된 필드를 다음 단계로 전달합니다. 프로젝션 은 Bson
을 구현하는 모든 클래스의 인스턴스 가 될 수 있지만 프로젝션 클래스의 메서드를 사용하는 것이 편리합니다.
다음 예에서는 _id
필드를 제외하고 title
및 author
필드를 포함하는 파이프라인 단계를 만듭니다.
project(fields(include("title", "author"), excludeId()))
계산된 필드
$project
단계는 계산된 필드도 프로젝션할 수 있습니다.
다음 예시 에서는 qty
필드 를 quantity
이라는 새 필드 에 프로젝션합니다. 즉, 필드 의 이름을 다음과 같이 변경합니다.
project(computed("quantity", "$qty"))
Sample
$sample
파이프라인 단계는 입력 문서에서 N
문서를 무작위로 선택합니다. 다음 예시 에서는 sample()
메서드를 사용하여 컬렉션 에서 5
문서를 무작위로 선택합니다.
sample(5)
Sort
$sort
파이프라인 단계는 모든 문서를 지정된 정렬 기준에 따라 정렬하여 다음 단계로 전달합니다. 정렬 기준은 Bson
을 구현하는 모든 클래스의 인스턴스 가 될 수 있지만 Sorts 클래스의 메서드를 사용하는 것이 편리합니다.
다음 예에서는 age
필드 값에 따라 내림차순으로 정렬한 다음 posts
필드 값에 따라 오름차순으로 정렬하는 파이프라인 단계를 만듭니다.
sort(orderBy(descending("age"), ascending("posts")))
Skip
$skip
파이프라인 단계에서는 해당 단계로 전달되는 지정된 수의 문서를 건너뛰고 나머지 문서를 다음 단계로 전달합니다.
다음 예시 에서는 처음 5
문서를 건너뜁니다.
skip(5)
Limit
$limit
파이프라인 단계는 다음 단계로 전달되는 문서 수를 제한합니다.
다음 예에서는 문서 수를 10)로 제한합니다.
limit(10)
Lookup
$lookup
파이프라인 단계에서는 다른 컬렉션 과 왼쪽 외부 조인을 수행하여 조인된 컬렉션 의 문서를 필터하다 하여 처리 합니다.
다음 예시 에서는 fromCollection
컬렉션 에 대해 왼쪽 외부 조인을 수행하여 local
필드 를 from
필드 에 조인하고 joinedOutput
필드 에 출력합니다.
lookup("fromCollection", "local", "from", "joinedOutput")
Group
$group
파이프라인 단계는 지정된 표현식 을 기준으로 문서를 그룹화하고 각 개별 그룹화에 대한 문서 를 다음 단계로 출력합니다. 그룹 은 그룹화할 표현식 을 지정하는 _id
와 각 그룹 에 대해 평가되는 0개 이상의 축적자로 구성됩니다.
축적자 표현을 단순화하기 위해 드라이버에는 지원되는 각 축적자에 대한 팩토리 메서드가 있는 Accumulators
싱글톤 객체가 포함되어 있습니다.
다음 예시 에서는 customerId
필드 값을 기준으로 문서를 그룹화하고, 각 그룹 에 대해 수량 필드 값의 합계와 평균을 totalQuantity
및 averageQuantity
필드에 각각 누적합니다.
group("$customerId", sum("totalQuantity", "$quantity"), avg("averageQuantity", "$quantity"))
Unwind
$unwind
파이프라인 단계에서는 입력 문서에서 배열 필드 를 분해하여 각 요소에 대한 문서 를 출력합니다.
다음 예시에서는 각 문서에 대해 sizes
배열의 각 요소에 대한 문서를 출력합니다.
unwind("$sizes")
다음 예에는 sizes
필드에 누락된 값이나 null 값이 있거나 sizes
목록이 비어 있는 문서도 포함됩니다.
unwind("$sizes", UnwindOptions().preserveNullAndEmptyArrays(true))
다음 예에서는 sizes
배열을 풀고 배열 인덱스를 position
필드에 출력합니다.
unwind("$sizes", UnwindOptions().includeArrayIndex("$position"))
SetWindowFields
$setWindowFields
파이프라인 단계에서는 창 연산자를 사용할 수 있습니다. 이 단계에서는 $group
파이프라인 단계와 유사하게 입력 문서를 분할하고, 선택적으로 정렬하고, 함수별로 지정된 Windows 를 통해 창 함수를 계산하여 문서의 필드를 계산한 다음 문서를 출력합니다. 창 은 파티션의 하위 집합입니다.
$group
파이프라인 단계와의 중요한 차이점은 동일한 파티션이나 창에 속한 문서가 단일 문서로 접히지 않는다는 것입니다.
운전자 에는 지원되는 창 연산자에 대한 팩토리 메서드가 있는 WindowedComputations
싱글톤 객체 가 포함되어 있습니다.
다음 예시 에서는 rainfall
및 temperature
필드에 표시된 보다 세분화된 측정값을 통해 각 지역별 지난 달 누적 강우량과 평균 기온을 계산합니다.
val pastMonth: Window = Windows.timeRange(-1, MongoTimeUnit.MONTH, Windows.Bound.CURRENT) setWindowFields(Some("$localityId"), Some(Sorts.ascending("measurementDateTime")), WindowedComputations.sum("monthlyRainfall", "$rainfall", Some(pastMonth)), WindowedComputations.avg("monthlyAvgTemp", "$temperature", Some(pastMonth)))
파이프라인 조립
파이프라인 연산자는 일반적으로 목록으로 결합되어 MongoCollection
의 aggregate()
메서드에 전달됩니다.
collection.aggregate(List(filter(equal("author", "Dave")), group("$customerId", sum("totalQuantity", "$quantity"), avg("averageQuantity", "$quantity")), out("authors")))