애그리게이션을 통한 데이터 변환
개요
이 가이드 에서는 코틀린 동기 (Kotlin Sync) 운전자 를 사용하여 집계 작업 을 수행하는 방법을 학습 수 있습니다.
집계 작업을 사용하여 MongoDB 컬렉션의 데이터를 프로세스 하고 계산된 결과를 반환할 수 있습니다. 쿼리 API 의 일부인 MongoDB 애그리게이션 프레임워크 는 데이터 처리 파이프라인 개념을 모델로 합니다. 문서는 하나 이상의 단계를 포함하는 파이프라인 에 들어가고, 각 단계는 문서를 변환하여 최종 애그리게이션 결과를 출력합니다.
집계 작업은 자동차 공장과 유사하게 생각할 수 있습니다. 자동차 공장에는 조립 라인이 있으며, 여기에는 드릴 및 용접기와 같은 특정 작업을 수행할 수 있는 특수 도구를 갖춘 조립 스테이션이 있습니다. 원부품이 공장에 들어오면 조립 라인에서 이를 변형하고 조립하여 완제품으로 만듭니다.
집계 파이프라인은 조립 라인이고, 집계 단계는 조립 스테이션이며, 작업 연산자는 특수 도구입니다.
집계 및 찾기 연산 비교
찾기 조치를 사용하여 다음 조치을 수행할 수 있습니다:
반환할 문서 선택
반환할 필드 선택
결과 정렬
집계 조치를 사용하여 다음 조치를 수행할 수 있습니다:
찾기 작업 수행
필드 이름 바꾸기
필드 계산
데이터 요약
그룹 값
제한 사항
집계 작업을 사용할 때는 다음과 같은 제한 사항이 적용 됩니다.
반환된 문서는 BSON 문서 크기 제한인 16메가바이트를 초과하지 않아야 합니다.
파이프라인 단계의 메모리 제한은 기본값 100 메가바이트입니다.
AggregateIterable
클래스의allowDiskUse()
메서드를 사용하여 이 제한을 초과할 수 있습니다.
집계 예시
이 섹션의 예제에서는 Atlas 샘플 데이터 세트 의 sample_restaurants
데이터베이스 에 있는 restaurants
컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 Atlas 시작하기 가이드 를 참조하세요.
다음 코틀린 (Kotlin) 데이터 클래스는 이 컬렉션 의 문서를 모델링합니다.
data class Restaurant( val name: String, val cuisine: String, val borough: String )
집계 파이프라인 빌드 및 실행
컬렉션 의 문서에 대해 집계 을 수행하려면 aggregate()
메서드에 집계 단계 목록을 전달합니다.
이 예시 는 뉴욕시 각 자치구에 있는 베이커리 수의 개수를 출력합니다. 다음 코드는 다음 단계를 포함하는 집계 파이프라인 을 생성합니다.
cuisine
필드 의 값이"Bakery"
인 문서를 필터하다 하는 $match 단계입니다.일치하는 문서를
borough
필드 별로 그룹 하여 해당 필드 의 각 고유 값에 대한 문서 수를 생성하는 $ 그룹 단계입니다.
val pipeline = listOf( Aggregates.match(Filters.eq(Restaurant::cuisine.name, "Bakery")), Aggregates.group("\$borough", Accumulators.sum("count", 1)) ) val results = collection.aggregate<Document>(pipeline) results.forEach { result -> println(result) }
Document{{_id=Bronx, count=71}} Document{{_id=Manhattan, count=221}} Document{{_id=Brooklyn, count=173}} Document{{_id=Queens, count=204}} Document{{_id=Staten Island, count=20}} Document{{_id=Missing, count=2}}
팁
$group
집계 단계에 대한 그룹 키를 지정할 때는 \
문자를 사용하여 $
문자를 이스케이프 처리해야 합니다.
애그리게이션 설명
MongoDB 가 작업을 실행하는 방법에 대한 정보를 보려면 파이프라인 에 $explain
집계 단계를 포함하면 됩니다. MongoDB 는 작업을 설명할 때 실행 계획 과 성능 통계를 반환합니다. 실행 계획은 MongoDB 가 작업을 완료할 수 있는 잠재적인 방법입니다. MongoDB 에 작업을 설명하도록 지시하면 MongoDB 가 작업에 대해 선택한 계획과 거부된 실행 계획을 모두 반환합니다.
다음 코드 예시 에서는 이전 섹션에 표시된 것과 동일한 집계 을 실행하고 $explain
단계를 추가하여 작업 세부 정보를 출력합니다.
print(collection.aggregate(pipeline).explain())
{ "explainVersion": "2", "queryPlanner": { "namespace": "sample_restaurants.restaurants" "indexFilterSet": false, "parsedQuery": { "cuisine": {"$eq": "Bakery"} }, "queryHash": "865F14C3", "planCacheKey": "0697561B", "optimizedPipeline": true, "maxIndexedOrSolutionsReached": false, "maxIndexedAndSolutionsReached": false, "maxScansToExplodeReached": false, "winningPlan": { ... } ... } ... }
Atlas Search
다음 파이프라인 단계 중 하나가 포함된 집계 파이프라인 생성하고 실행 Atlas Search 쿼리 수행할 수 있습니다.
$search
$searchMeta
Atlas Search 파이프라인 단계에 대해 자세히 학습 Atlas 문서에서 집계 파이프라인 단계 선택을 참조하세요.
파이프라인 검색 단계 만들기
검색 연산자를 사용하여 Atlas Search 파이프라인 단계에서 검색 기준을 만들 수 있습니다.
코틀린 동기 (Kotlin Sync) 운전자 다음 연산자에 대한 헬퍼 메서드를 제공합니다.
연산자 | 설명 |
---|---|
불완전한 입력 문자열에서 일련의 문자가 포함된 단어나 구를 검색 합니다. | |
두 개 이상의 연산자를 단일 쿼리로 결합합니다. | |
필드 지정한 값과 일치하는지 확인합니다. | |
문서에 인덱싱된 지정 필드 이름에 대한 경로가 있는지 테스트합니다. | |
지정된 경로에서 BSON 번호, 날짜, 부울, objectId, uuid 또는 문자열 값의 배열 검색 하고 필드 값이 지정된 배열 의 임의 값과 동일한 문서를 반환합니다. | |
입력 문서와 유사한 문서를 반환합니다. | |
숫자, 날짜 및 GeoJSON 포인트 값을 쿼리하고 점수를 매기는 기능을 지원합니다. | |
인덱스 구성에 지정된 분석기 사용하여 정렬된 용어 시퀀스가 포함된 문서를 검색 합니다. | |
인덱싱된 필드와 값의 조합을 쿼리할 수 있습니다. | |
숫자, 날짜 및 문자열 값을 쿼리하고 점수를 매길 수 있도록 지원합니다. | |
쿼리 필드 정규 표현식 으로 해석합니다. | |
인덱스 구성에서 지정한 분석기 사용하여 전체 텍스트 검색 수행합니다. | |
검색 문자열에 모든 문자와 일치할 수 있는 특수 문자를 사용하는 쿼리를 활성화합니다. |
파이프라인 검색 단계 예시
참고
Atlas 샘플 데이터 세트
이 예시 sample_mflix.movies
Atlas 샘플 데이터 세트의 컬렉션 사용합니다. 무료 계층 Atlas cluster 설정하다 하고 샘플 데이터 세트를 로드하는 방법을 학습 Atlas 설명서에서 Atlas 시작하기 튜토리얼을 참조하세요.
이 예시 실행 하려면 먼저 movies
컬렉션 에 다음 정의가 있는 Atlas Search 인덱스 만들어야 합니다.
{ "mappings": { "dynamic": true, "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "normalizer": "lowercase", "type": "token" } } } }
Atlas Search 인덱스 생성에 대해 자세히 학습 Atlas Search 및 Vector Search 인덱스 가이드 를 참조하세요.
다음 코드는 다음 사양의 $search
단계를 생성합니다.
genres
배열"Comedy"
가 포함되어 있는지 확인합니다.fullplot
필드 에서"new york"
구문을 검색합니다.1950
~2000
사이의year
값과 일치합니다.텀
"Love"
로 시작하는title
값을 검색합니다.
val searchStage = Aggregates.search( SearchOperator.compound() .filter( listOf( SearchOperator.`in`(fieldPath("genres"), listOf("Comedy")), SearchOperator.phrase(fieldPath("fullplot"), "new york"), SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000), SearchOperator.wildcard(fieldPath("title"), "Love *") ) ) ) val projectStage = Aggregates.project( Projections.include("title", "year", "genres")) val pipeline = listOf(searchStage, projectStage) val results = collection.aggregate(pipeline) results.forEach { result -> println(result) }
Document{{_id=..., genres=[Comedy, Romance], title=Love at First Bite, year=1979}} Document{{_id=..., genres=[Comedy, Drama], title=Love Affair, year=1994}}
Atlas Search 헬퍼 메서드에 대해 자세히 학습 드라이버 코어 API 문서에서 SearchOperator 인터페이스 참조를 참조하세요.
추가 정보
표현식 연산자의 전체 목록을 보려면 MongoDB Server 매뉴얼에서 애그리게이션 연산자 를 참조하세요.
집계 파이프라인 을 어셈블하는 학습 에 대해 알아보고 예시를 보려면 MongoDB Server 매뉴얼에서 집계 파이프라인 을 참조하세요.
파이프라인 단계 생성에 학습 보려면 MongoDB Server 매뉴얼의 애그리게이션 단계 를 참조하세요.
MongoDB 작업에 학습 보려면 MongoDB Server 매뉴얼의 출력 및 쿼리 계획 설명을 참조하세요.
API 문서
코틀린( 코틀린 동기 (Kotlin Sync) 운전자 로 집계 작업을 실행하는 방법에 대한 자세한 내용은 다음 API 문서를 참조하세요.