집계 파이프라인은 데이터 처리 파이프라인 개념을 모델로 한 데이터 애그리게이션 프레임워크입니다.
집계 에 학습 보려면 서버 매뉴얼에서 집계 파이프라인 을 참조하세요.
전제 조건
이 가이드의 코드 예제를 실행하려면 다음 구성 요소를 설정해야 합니다.
test.restaurants
문서 자산restaurants.json
Github 에 있는 파일의 문서로 채워진 컬렉션 입니다.다음 가져오기 문:
import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Accumulators; import com.mongodb.client.model.Projections; import com.mongodb.client.model.Filters; import org.bson.Document;
중요
이 가이드 에서는 샘플 사용자 지정 구독자 구현 가이드 에 설명된 사용자 지정 Subscriber
구현을 사용합니다.
MongoDB 배포에 연결하기
먼저 MongoDB deployment에 연결한 다음 MongoDatabase
및 MongoCollection
인스턴스를 선언하고 정의합니다.
다음 코드는 포트 27017
의 localhost
에서 실행되는 독립형 MongoDB 배포서버에 연결합니다. 그런 다음 test
데이터베이스를 참조하는 database
변수와 restaurants
컬렉션을 참조하는 collection
변수를 정의합니다.
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
MongoDB deployment에 연결하는 방법에 대해 자세히 알아보려면 MongoDB에 연결 튜토리얼을 참조하세요.
집계 수행
집계 집계 단계 목록을 MongoCollection.aggregate()
메서드에 전달합니다. 이 운전자 는 집계 단계에 대한 빌더 가 포함된 Aggregates
헬퍼 클래스를 제공합니다.
이 예제에서 집계 파이프라인은 다음 작업을 수행합니다.
$match
단계를 사용하여categories
배열 필드에"Bakery"
요소가 포함된 문서를 필터링합니다. 이 예제에서는Aggregates.match()
를 사용하여$match
단계를 빌드합니다.
$group
단계를 사용하여 일치하는 문서를stars
필드 별로 그룹 하여stars
의 각 고유 값에 대한 문서 수를 누적합니다. 이 예시 에서는Aggregates.group()
를 사용하여$group
단계를 빌드 하고Accumulators.sum()
를 사용하여 축적자 표현식 을 빌드 합니다.$group
단계 내에서 사용하기 위한 축적자 자 표현식의 경우 운전자 는Accumulators
헬퍼 클래스를 제공합니다.
collection.aggregate( Arrays.asList( Aggregates.match(Filters.eq("categories", "Bakery")), Aggregates.group("$stars", Accumulators.sum("count", 1)) ) ).subscribe(new PrintDocumentSubscriber());
애그리게이션 표현식 사용
$group
축적자 자 표현식의 경우 운전자 는 Accumulators
헬퍼 클래스를 제공합니다. 다른 집계 표현식의 경우 Document
클래스를 사용하여 표현식 을 수동으로 빌드 합니다.
다음 예제에서 집계 파이프라인은 $project
단계를 사용하여 name
필드와 값이 categories
배열의 첫 번째 요소인 계산된 필드 firstCategory
만 반환합니다. 이 예제에서는 Aggregates.project()
및 다양한 Projections
클래스 메서드를 사용하여 $project
단계를 빌드합니다.
collection.aggregate( Arrays.asList( Aggregates.project( Projections.fields( Projections.excludeId(), Projections.include("name"), Projections.computed( "firstCategory", new Document("$arrayElemAt", Arrays.asList("$categories", 0)) ) ) ) ) ).subscribe(new PrintDocumentSubscriber());
애그리게이션 설명
집계 파이프라인 을 $explain
하려면 AggregatePublisher.explain()
메서드를 호출합니다.
collection.aggregate( Arrays.asList( Aggregates.match(Filters.eq("categories", "Bakery")), Aggregates.group("$stars", Accumulators.sum("count", 1)))) .explain() .subscribe(new PrintDocumentSubscriber());
Atlas Search
다음 파이프라인 단계 중 하나가 포함된 집계 파이프라인 생성하고 실행하여 Atlas Search 쿼리 수행할 수 있습니다.
$search
$searchMeta
Java Reactive Streams 운전자 애그리게이션을 제공합니다.검색() 및 Aggregates.searchMeta() 메서드를 사용하여 Atlas Search 쿼리를 수행합니다.
Atlas Search 파이프라인 단계에 대해 자세히 학습하려면 Atlas 문서에서 집계 파이프라인 단계 선택 을 참조하세요.
파이프라인 검색 단계 만들기
검색 연산자를 사용하여 Atlas Search 파이프라인 단계에서 검색 기준을 만들 수 있습니다.
Java Reactive Streams 운전자 다음 연산자에 대한 헬퍼 메서드를 제공합니다.
연산자 | 설명 |
---|---|
불완전한 입력 문자열에서 일련의 문자가 포함된 단어나 구를 검색 합니다. | |
두 개 이상의 연산자를 단일 쿼리로 결합합니다. | |
필드 지정한 값과 일치하는지 확인합니다. | |
문서에 인덱싱된 지정 필드 이름에 대한 경로가 있는지 테스트합니다. | |
지정된 경로에서 BSON 번호, 날짜, 부울, ObjectId, uuid 또는 문자열 값의 배열 검색 하고 필드 값이 지정된 배열 의 임의 값과 같은 문서를 반환합니다. | |
입력 문서와 유사한 문서를 반환합니다. | |
숫자, 날짜 및 GeoJSON 포인트 값을 쿼리하고 점수를 매기는 기능을 지원합니다. | |
인덱스 구성에 지정된 분석기 사용하여 정렬된 용어 시퀀스가 포함된 문서를 검색 합니다. | |
인덱싱된 필드와 값의 조합을 쿼리할 수 있습니다. | |
숫자, 날짜 및 문자열 값을 쿼리하고 점수를 매길 수 있도록 지원합니다. | |
쿼리 필드 정규 표현식 으로 해석합니다. | |
인덱스 구성에서 지정한 분석기 사용하여 전체 텍스트 검색 수행합니다. | |
검색 문자열에 모든 문자와 일치할 수 있는 특수 문자를 사용하는 쿼리를 활성화합니다. |
파이프라인 검색 단계 예시
참고
Atlas 샘플 데이터 세트
이 예시 Atlas 샘플 데이터 세트의 sample_mflix.movies
컬렉션 사용합니다. 무료 계층 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 인덱스 관리 섹션을 참조하세요.
다음 코드는 다음 사양의 $search
단계를 생성합니다.
genres
배열"Comedy"
가 포함되어 있는지 확인합니다.fullplot
필드 에서"new york"
구문을 검색합니다.1950
~2000
사이의year
값과 일치합니다.텀
"Love"
로 시작하는title
값을 검색합니다.
Bson searchStageFilters = Aggregates.search( SearchOperator.compound() .filter( List.of( SearchOperator.in(fieldPath("genres"), List.of("Comedy")), SearchOperator.phrase(fieldPath("fullplot"), "new york"), SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000), SearchOperator.wildcard(fieldPath("title"), "Love *") ))); Bson projection = Aggregates.project(Projections.fields( Projections.include("title", "year", "genres") )); List<Bson> aggregateStages = List.of(searchStageFilters, projection); Publisher<Document> publisher = movies.aggregate(aggregateStages); publisher.subscribe(new SubscriberHelpers.PrintDocumentSubscriber()); Mono.from(publisher).block();
{"_id": ..., "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979} {"_id": ..., "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994}
Atlas Search 헬퍼 메서드에 대해 자세히 학습 드라이버 코어 API 문서에서 SearchOperator 인터페이스 참조를 확인하세요.
추가 정보
표현식 연산자의 전체 목록을 보려면 MongoDB Server 매뉴얼에서 애그리게이션 연산자 를 참조하세요.
집계 파이프라인 을 어셈블하는 학습 에 대해 알아보고 예시를 보려면 MongoDB Server 매뉴얼에서 집계 파이프라인 을 참조하세요.
파이프라인 단계 생성에 학습 보려면 MongoDB Server 매뉴얼의 애그리게이션 단계 를 참조하세요.
MongoDB 작업에 학습 보려면 MongoDB Server 매뉴얼의 출력 및 쿼리 계획 설명을 참조하세요.
API 문서
이 가이드 에 언급된 클래스 및 메서드에 학습 보려면 다음 API 설명서를 참조하세요.