문서 데이터 포맷: 데이터 클래스
이 페이지의 내용
개요
이 가이드에서는 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으로 저장해야 하는 경우에만 이 주석을 사용합니다. 경고: 데이터 클래스 속성 과 동일한 유형으로 저장 하는 속성 에 주석을포함하면 코드에서 예외가 발생할 수 있습니다. |
이러한 속성 주석에 대한 참조 정보는 org.bson.codecs.pojo.annotations 패키지 를 참조하세요.
주석이 달린 데이터 클래스 예시
이 섹션의 코드 예시는 네트워크 기기를 설명하는 다음 샘플 데이터 클래스를 참조합니다.
data class NetworkDevice( val deviceId: String, val name: String, 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=...)