Docs Menu
Docs Home
/ / /
Java 동기화
/ / /

반환할 필드 지정

이 페이지의 내용

  • 개요
  • 행동
  • 설명

이 가이드에서는 MongoDB Java 드라이버를 사용하여 읽기 작업에서 반환된 문서에 표시되는 필드를 제어하는 방법에 대해 설명합니다.

대부분의 읽기 요청에는 문서에 있는 필드의 일부만 필요합니다. 예를 들어, 사용자 로그인을 허용할 때 프로필 정보 전체가 아닌 사용자 이름만 필요할 수 있습니다. MongoDB의 쿼리는 기본적으로 일치하는 문서에 존재하는 모든 필드를 반환합니다. projection을 사용하여 필요한 데이터만 반환할 수 있습니다.

프로젝션은 반환할 문서의 필드를 MongoDB에 지시하는 문서입니다. Projections 클래스를 사용하여 프로젝션 문서를 구성합니다.

프로젝션은 두 가지 방식으로 작동합니다.

  • 명시적으로 필드 포함. 이 방법에는 지정되지 않은 모든 필드를 암시적으로 제외하는 부작용이 있습니다.

  • 암시적으로 필드 제외. 이 방법에는 지정되지 않은 모든 필드를 암시적으로 포함하는 부작용이 있습니다.

이 두 가지 프로젝션 방법은 상호 배타적입니다. 필드를 명시적으로 포함하는 경우 필드를 명시적으로 제외할 수 없으며 그 반대의 경우도 마찬가지입니다.

중요

_id 필드에는 이러한 메커니즘이 적용되지 않습니다. _id 필드가 반환되지 않도록 하려면 이 필드를 명시적으로 제외해야 합니다. 포함할 특정 필드를 지정한 경우에도 _id 필드를 제외할 수 있습니다.

다양한 과일을 설명하는 문서가 포함된 다음 컬렉션이 있다고 가정해 보겠습니다.

{ "_id": 1, "name": "apples", "qty": 5, "rating": 3 },
{ "_id": 2, "name": "bananas", "qty": 7, "rating": 1 },
{ "_id": 3, "name": "oranges", "qty": 6, "rating": 2 },
{ "_id": 4, "name": "avocados", "qty": 3, "rating": 5 },

다음 쿼리에서 프로젝션을 전달하여 각 문서의 name 필드를 반환합니다.

// return all documents with *only* the name field
Bson filter = Filters.empty();
Bson projection = Projections.fields(Projections.include("name"));
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc));

프로젝션 문서는 읽기 작업 결과에 반환된 각 문서의 name 필드를 포함하도록 지정합니다. 결과적으로 이 프로젝션은 qtyrating 필드를 암시적으로 제외합니다. 빈 쿼리 필터를 사용하여 이 프로젝션을 find()에 연결하면 다음 결과가 생성됩니다.

{ "_id": 1, "name": "apples" }
{ "_id": 2, "name": "bananas" }
{ "_id": 3, "name": "oranges" }
{ "_id": 4, "name": "avocados" }

이 프로젝션은 명시적으로 name 필드만 포함했지만 쿼리는 _id 필드도 반환했습니다.

_id 필드는 특별한 경우입니다. 명시적으로 제외되지 않는 한 모든 쿼리 결과에 항상 포함됩니다. 그 이유는 _id 필드가 각 문서의 고유 식별자이며 쿼리를 구성할 때 유용하게 사용할 수 있는 속성이기 때문입니다.

movies 컬렉션은 이 속성이 왜 유용한지를 보여주는 좋은 예입니다. 리메이크나 별도 작품에서 동일한 영화 제목을 사용하는 경우가 있기 때문에 특정 영화를 가려내려면 고유한 _id 값이 필요합니다.

_id는 프로젝션에서 상호 배타적인 포함-제외 동작에 대한 유일한 예외입니다. _id가 반환된 문서에 표시되지 않도록 하려면 다른 필드를 명시적으로 포함하더라도 _id 필드를 명시적으로 제외할 수있습니다.

// return all documents with only the name field
Bson filter = Filters.empty();
Bson projection = Projections.fields(Projections.include("name"), Projections.excludeId());
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc));

프로젝션 문서는 읽기 작업 결과에 반환된 각 문서의 name 필드를 포함하도록 지정하고 _id 필드를 제외하도록 지정합니다. 결과적으로 이 프로젝션은 qtyrating 필드를 암시적으로 제외합니다. 빈 쿼리 필터를 사용하여 이 프로젝션을 find()에 연결하면 다음 결과가 생성됩니다.

{ "name": "apples" }
{ "name": "bananas" }
{ "name": "oranges" }
{ "name": "avocados" }

프로젝션에 포함할 필드를 여러 개 지정할 수도 있습니다.

프로젝션에서 필드를 지정하는 순서는 필드가 반환되는 순서를 변경하지 않습니다.

Bson filter = Filters.empty();
Bson projection = Projections.fields(Projections.include("name", "rating"), Projections.excludeId());
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc));

프로젝션에 포함할 두 개의 필드를 식별하는 이 예제는 다음과 같은 결과를 산출합니다.

{ "name": "apples", "rating": 3 }
{ "name": "bananas", "rating": 1 }
{ "name": "oranges", "rating": 2 }
{ "name": "avocados", "rating": 5 }

추가 프로젝션 예제는 쿼리에서 반환할 프로젝트 필드에 대한 MongoDB 매뉴얼 페이지를 참조하세요.

돌아가기

반환되는 결과 수 제한

이 페이지의 내용