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

문서 데이터 포맷: 데이터 클래스

이 페이지의 내용

  • 개요
  • 데이터 클래스 직렬화 및 역직렬화
  • 데이터 클래스 예시
  • 데이터 클래스 삽입
  • 데이터 클래스 조회
  • 주석을 사용하여 구성 요소 변환 지정하기
  • 주석이 달린 데이터 클래스 예시
  • 주석이 달린 데이터 클래스 삽입
  • 주석이 달린 데이터 클래스 조회
  • 재귀 유형을 사용한 작업

이 가이드에서는 Kotlin 데이터 클래스를 사용하여 MongoDB Kotlin 드라이버에 데이터를 저장하고 조회하는 방법을 배울 수 있습니다.

이 드라이버는 기본 코덱 레지스트리를 사용하여 MongoDB 읽기 및 쓰기 작업을 위한 Kotlin 데이터 클래스 인코딩 및 디코딩을 기본적으로 지원합니다. 기본 코덱 레지스트리는 Kotlin 및 Java 유형을 인코딩 및 디코딩하는 방법을 정의하는 코덱이라는 클래스의 컬렉션입니다.

이 섹션의 코드 예시는 데이터 스토리지 기기를 설명하는 다음 샘플 데이터 클래스를 참조합니다.

data class DataStorage(val productName: String, val capacity: Double)

다음 코드에 표시된 대로 DataStorage 인스턴스를 삽입할 수 있습니다.

val collection = database.getCollection<DataStorage>("data_storage")
val record = DataStorage("tape", 5.0)
collection.insertOne(record)

다음 코드에 표시된 대로 문서를 DataStorage 인스턴스로 검색하고 출력할 수 있습니다.

val collection = database.getCollection<DataStorage>("data_storage_devices")
// Retrieve and print the documents as data classes
val resultsFlow = collection.find()
resultsFlow.collect { println(it) }
DataStorage(productName=tape, capacity=5.0)

컬렉션을 검색할 때 지정한 클래스와 다른 경우에도 컬렉션에서 반환된 문서에 대한 클래스를 지정합니다.

다음 예시에서는 이전 예시에서 DataStorage 데이터 클래스로 표시된 문서를 업데이트하고 업데이트된 문서를 NewDataStorage 유형으로 반환합니다. 이 작업은 name 값이 tape인 문서에 releaseDate 필드를 추가합니다.

// Define a data class for returned documents
data class NewDataStorage(
val productName: String,
val capacity: Double,
val releaseDate: LocalDate
)
val filter = Filters.eq(DataStorage::productName.name, "tape")
val update = Updates.currentDate("releaseDate")
val options = FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)
// Specify the class for returned documents as the type parameter in withDocumentClass()
val result = collection
.withDocumentClass<NewDataStorage>()
.findOneAndUpdate(filter, update, options)
println("Updated document: ${result}")
Updated document: NewDataStorage(productName=tape, capacity=5.0, releaseDate=2023-06-15)

이 기능 에 대한 자세한 내용은 데이터베이스 및 컬렉션 가이드 에서 반환 유형 지정 을 참조하세요.

이 섹션에서는 데이터 클래스의 직렬화 동작을 구성하는 데 사용할 수 있는 주석에 대해 설명하고 주석 동작을 보여주는 예시를 제공합니다.

데이터 클래스에 다음 주석을 사용할 수 있습니다.

주석 이름
설명
BsonId
직렬화할 프로퍼티를 _id 프로퍼티로 표시합니다.
BsonProperty
데이터 클래스 필드를 BSON으로 변환할 때 사용자 지정 문서 필드 이름을 지정합니다.
BsonRepresentation

MongoDB가 값을 저장하는 데 사용하는 BSON types을 지정합니다. 값을 데이터 클래스 속성과 다른 BSON type으로 저장해야 하는 경우에만 이 주석을 사용합니다.

경고: 데이터 클래스 속성 과 동일한 유형으로 저장 하는 속성 에 BsonRepresentation 주석을 포함하면 코드에서 예외가 발생할 수 있습니다.

이러한 속성 주석에 대한 참조 정보는 org.bson.codecs.pojo.annotations 패키지를 참조하세요.

이 섹션의 코드 예시는 네트워크 기기를 설명하는 다음 샘플 데이터 클래스를 참조합니다.

data class NetworkDevice(
@BsonId
@BsonRepresentation(BsonType.OBJECT_ID)
val deviceId: String,
val name: String,
@BsonProperty("type")
val deviceType: String
)

다음 코드에 표시된 대로 NetworkDevice 인스턴스를 삽입할 수 있습니다.

val collection = database.getCollection<NetworkDevice>("network_devices")
// Insert the record
val deviceId = ObjectId().toHexString()
val device = NetworkDevice(deviceId, "Enterprise Wi-fi", "router")
collection.insertOne(device)

MongoDB에 삽입된 문서는 다음과 같습니다.

{
_id: ObjectId("fedc..."),
name: 'Enterprise Wi-fi',
type: 'router'
}

다음 코드에 표시된 대로 문서를 NetworkDevice 인스턴스로 검색하고 출력할 수 있습니다.

val collection = database.getCollection<NetworkDevice>("network_devices")
// Return all documents in the collection as data classes
val resultsFlow = collection.find()
resultsFlow.collect { println(it) }
NetworkDevice(deviceId=645cf..., name=Enterprise Wi-fi, deviceType=router)

드라이버는 기본적으로 런타임 재귀를 유발하지 않고 재귀적으로 정의된 데이터 클래스의 인코딩 및 디코딩을 지원합니다. 이 지원은 유형 정의에서 여러 데이터 클래스 유형으로 확장 적용됩니다. 다음 코드에서는 재귀 데이터 클래스 설계의 예를 보여 줍니다.

data class DataClassTree(
val content: String,
val left: DataClassTree?,
val right: DataClassTree?
)

재귀적으로 정의된 데이터 클래스에 대해 다른 데이터 클래스와 동일한 방식으로 읽기 및 쓰기 작업을 수행할 수 있습니다. 다음 코드는 DataClassTree 유형 컬렉션에서 찾기 작업을 실행하는 방법을 보여줍니다.

val collection = database.getCollection<DataClassTree>("myCollection")
val filter = Filters.eq("left.left.right.content", "high german")
val resultsFlow = collection.find(filter)
resultsFlow.collect { println(it) }
DataClassTree(content=indo-european, left=DataClassTree(content=germanic, left=DataClassTree(content=german, left=null, right=DataClassTree(content=high german, ...)), right=...)

돌아가기

데이터 형식