반환할 필드 지정
개요
이 가이드에서는 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( val id: Int, val name: String, val qty: Int, val rating: Int )
다음 쿼리에서는 프로젝션을 전달하여 각 문서의 name
필드를 반환합니다. 결과는 FruitName
Kotlin 데이터 클래스를 사용하여 모델링됩니다.
data class FruitName( 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
필드를 포함 하도록 지정합니다. 결과적으로 이 프로젝션은 qty
및 rating
필드를 암시적으로 제외합니다. 빈 쿼리 필터를 사용하여 이 프로젝션을 find()
에 연결하면 위의 결과가 생성됩니다.
이 프로젝션은 명시적으로 name
필드만 포함했지만 쿼리는 데이터 클래스에서 id
로 표시되는 _id
필드도 반환했습니다.
_id
필드는 특별한 경우입니다. 명시적으로 제외되지 않는 한 모든 쿼리 결과에 항상 포함됩니다. 그 이유는 _id
필드가 각 문서의 고유 식별자이며 쿼리를 구성할 때 유용하게 사용할 수 있는 속성이기 때문입니다.
_id
는 프로젝션에서 상호 배타적인 포함-제외 동작에 대한 유일한 예외입니다. _id
가 반환된 문서에 표시되지 않도록 하려면 다른 필드를 명시적으로 포함하더라도 _id
필드를 명시적으로 제외할 수있습니다.
data class FruitName( 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
필드를 제외 하도록 지정합니다. 결과적으로 이 프로젝션은 qty
및 rating
필드를 암시적으로 제외합니다. 빈 쿼리 필터를 사용하여 이 프로젝션을 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 매뉴얼 페이지를 참조하세요.