ドキュメントデータ形式: データクラス
項目一覧
Overview
このガイドでは、 Kotlin データ クラスを使用して MongoDB Kotlin ドライバーにデータを保存および取得する方法を学習できます。
データクラスの直列化と逆直列化
ドライバーは、デフォルトの コーデック レジストリを使用して、MongoDB の読み取りおよび書込み (write) 操作用の 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 タイプを指定します。 この注釈は、データクラス プロパティとは異なる BSON 型として値を保存する必要がある場合にのみ使用してください。 警告: |
これらのプロパティ注釈に関する参照情報については、 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=...)