반환할 필드 지정
개요
이 가이드 에서는 Java Reactive Streams 운전자 를 사용하여 읽기 작업에서 반환할 필드를 지정하는 방법을 학습 수 있습니다. MongoDB 가 쿼리 에서 반환하는 필드를 지정하는 문서 인 프로젝션 을 사용하여 이러한 필드를 선택할 수 있습니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트 의 sample_restaurants.restaurants
컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 시작하기 가이드 를 참조하세요.
중요
프로젝트 리액터 라이브러리
이 가이드 에서는 Project Reactor 라이브러리를 Publisher
사용하여 Java Reactive Streams 운전자 메서드에서 반환된 인스턴스를 사용합니다. 프로젝트 Reactor 라이브러리와 사용 방법에 학습 보려면 Reactor 문서에서 시작하기 를 참조하세요. 이 가이드 에서 Project Reactor 라이브러리 메서드를 사용하는 방법에 학습 보려면 MongoDB 에 데이터 쓰기 가이드 를 참조하세요.
프로젝션 유형
프로젝션 을 사용하여 검색된 문서에 포함하고 제외할 필드를 지정할 수 있습니다. 기본값 특정 필드를 포함하면 다른 모든 필드가 제외되므로 결과에서 _id
필드 를 제외하지 않는 한 포함 및 제외 문을 단일 프로젝션 으로 결합할 수 없습니다.
포함할 필드 지정
읽기 작업의 결과에 포함할 필드를 지정하려면 다음 구문을 사용합니다.
projection(fields(include("<field name>")))
프로젝션 을 사용하려면 find()
메서드에 쿼리 필터하다 를 전달합니다. 그런 다음 projection()
메서드를 find()
메서드 호출에 연결합니다.
다음 예시 에서는 find()
메서드를 사용하여 name
필드 값이 "Emerald Pub"
인 문서를 조회 합니다. 그런 다음 프로젝션 을 사용하여 반환된 문서에서 name
, cuisine
및 borough
필드만 포함합니다.
FindPublisher<Document> findProjectionPublisher = restaurants.find( eq("name", "Emerald Pub")) .projection(fields(include("name", "cuisine", "borough"))); Flux.from(findProjectionPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': ObjectId('...'), 'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub'} {'_id': ObjectId('...'), 'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub'}
프로젝션 을 사용하여 반환 문서 에 포함할 필드를 지정하면 기본값 _id
필드 도 포함됩니다. 다른 모든 필드는 암시적으로 제외됩니다. 반환된 문서에서 _id 필드 를 생략하려면 명시적으로 제외 해야 합니다.
_id 필드 제외
excludeId()
메서드를 사용하여 반환된 문서에서 _id
필드 를 제외할 수 있습니다.
다음 예시 에서는 이전 예시 와 동일한 쿼리 를 수행하지만 반환된 문서에서 _id
필드 도 제외합니다.
FindPublisher<Document> findProjectionPublisher = restaurants.find( eq("name", "Emerald Pub")) .projection(fields(include("name", "cuisine", "borough"), excludeId())); Flux.from(findProjectionPublisher) .doOnNext(System.out::println) .blockLast();
{'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub'} {'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub'}
제외할 필드 지정
읽기 작업 결과에서 제외할 필드를 지정하려면 다음 구문을 사용합니다.
projection(fields(exclude("<field name>")))
프로젝션 을 사용하려면 find()
메서드에 쿼리 필터하다 를 전달합니다. 그런 다음 projection()
메서드를 find()
메서드 호출에 연결합니다.
다음 예제에서는 find()
메서드를 사용하여 name
필드 값이 "Emerald Pub"
인 모든 레스토랑을 찾습니다. 그런 다음 프로젝션 을 사용하여 반환된 문서에서 grades
및 address
필드를 제외합니다.
FindPublisher<Document> findProjectionPublisher = restaurants.find( eq("name", "Emerald Pub")) .projection(fields(exclude("grades", "address"))); Flux.from(findProjectionPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': ObjectId('...'), 'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub', 'restaurant_id': '40367329'} {'_id': ObjectId('...'), 'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub', 'restaurant_id': '40668598'}
프로젝션을 사용하여 제외할 필드를 지정하면 지정되지 않은 모든 필드가 반환 문서에 암시적으로 포함됩니다.
프로젝션 오류
다음 섹션에서는 프로젝션을 사용할 때 발생할 수 있는 오류에 대해 설명합니다.
포함 및 제외 오류
단일 프로젝션 에 필드를 포함 및 제외하려고 하면 운전자 는 다음을 반환합니다.
OperationFailure: ... Cannot Do Exclusion on Field <field> in Inclusion Projection
이 오류를 해결하려면 프로젝션 이 포함할 필드만 지정하거나 제외할 필드만 지정해야 합니다.
추가 정보
프로젝션에 학습 보려면 MongoDB Server 매뉴얼의 프로젝트 필드 가이드 를 참조하세요.
API 문서
이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.