Docs Menu
Docs Home
/ / /
Kotlin 코루틴
/ / /

반환할 필드 지정

이 페이지의 내용

  • 개요
  • 행동
  • 설명

이 가이드에서는 MongoDB 코틀린(Kotlin) 드라이버를 사용하여 읽기 작업에서 반환된 문서에 표시되는 필드를 제어하는 방법을 배울 수 있습니다.

대부분의 읽기 요청에는 문서에 있는 필드의 일부만 필요합니다. 예를 들어, 사용자 로그인을 허용할 때 프로필 정보 전체가 아닌 사용자 이름만 필요할 수 있습니다. 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 },

이 데이터는 다음 Kotlin 데이터 클래스를 사용하여 모델링됩니다.

data class Fruit(
@BsonId val id: Int,
val name: String,
val qty: Int,
val rating: Int
)

다음 쿼리에서는 프로젝션을 전달하여 각 문서의 name 필드를 반환합니다. 결과는 FruitName Kotlin 데이터 클래스를 사용하여 모델링됩니다.

data class FruitName(
@BsonId val id: Int? = null,
val name: String
)
// Return all documents with only the name field
val filter = Filters.empty()
val projection = Projections.fields(
Projections.include(FruitName::name.name)
)
val flowResults = collection.find<FruitName>(filter).projection(projection)
flowResults.collect { println(it)}
FruitName(id=1, name=apples),
FruitName(id=2, name=bananas),
FruitName(id=3, name=oranges),
FruitName(id=4, name=avocados)

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

이 프로젝션은 명시적으로 name 필드만 포함했지만 쿼리는 데이터 클래스에서 id 로 표시되는 _id 필드도 반환했습니다.

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

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

data class FruitName(
@BsonId val id: Int? = null,
val name: String
)
// Return all documents with *only* the name field
// excludes the id
val filter = Filters.empty()
val projection = Projections.fields(
Projections.include(FruitName::name.name),
Projections.excludeId()
)
val flowResults = collection.find<FruitName>(filter).projection(projection)
flowResults.collect { println(it)}
FruitName(name=apples),
FruitName(name=bananas),
FruitName(name=oranges),
FruitName(name=avocados)

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

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

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

프로젝션에 포함할 두 필드를 식별하는 이 예시에서는 FruitRating Kotlin 데이터 클래스를 사용하여 다음과 같은 결과를 얻을 수 있습니다.

data class FruitRating(
val name: String,
val rating: Int
)
val filter = Filters.empty()
val projection = Projections.fields(
Projections.include(FruitRating::name.name, FruitRating::rating.name),
Projections.excludeId()
)
val flowResults = collection.find<FruitRating>(filter).projection(projection)
flowResults.collect { println(it)}
FruitRating(name=apples, rating=3),
FruitRating(name=bananas, rating=1),
FruitRating(name=oranges, rating=2),
FruitRating(name=avocados, rating=5)

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

돌아가기

반환되는 결과 수 제한

이 페이지의 내용