Docs Menu
Docs Home
/ / /
Kotlin コルーチン
/ /

ドキュメントデータ形式: データクラス

項目一覧

  • 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 型として値を保存する必要がある場合にのみ使用してください。

警告: 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=...)

戻る

Data Formats