Docs Menu

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

このガイドでは、 Kotlinデータ クラス を使用してMongoDB Kotlin Sync Driver にデータを保存および取得する方法を学習できます。

ドライバーは、デフォルトのコーデック レジストリ を使用して、 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 result = collection.find().firstOrNull()
println("${result}")
DataStorage(productName=tape, capacity=5.0)

Tip

ビルダ メソッドとデータ クラスのプロパティ

オプションのKotlin Syncドライバー拡張の依存関係をアプリケーションに追加することで、ビルダ クラスのメソッドをデータクラスプロパティで直接使用できます。 詳細と例については、 「データ クラスでビルダを使用するか 」のガイドをご覧ください。

コレクションから返されるドキュメントには、コレクションを取得するときに指定したクラスと異なる場合でも、クラスを指定する必要があります。

次の例では、前の例の DataStorage データクラスによって表されるドキュメントのアップデートを実行し、アップデートされたドキュメントをDataStorageAlt タイプとして返します。 この操作では、 nameフィールドの値が tape であるドキュメントに releaseDateフィールドが追加されます。

// Define a data class for returned documents
data class DataStorageAlt(
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
val newResult = collection
.withDocumentClass<DataStorageAlt>()
.findOneAndUpdate(filter, update, options)
println("Document after update:\n${newResult}")
Document after update:
DataStorageAlt(productName=tape, capacity=5.0, releaseDate=2025-01-24)

このセクションでは、データ クラスの直列化動作を構成するために使用できる注釈について説明し、注釈の動作を示す例を示します。

データクラスでは、次の注釈を使用できます。

注釈名
説明

BsonId

シリアル化するプロパティを _idプロパティとしてマークします。

BsonProperty

データクラス フィールドを BSON に変換する時のカスタム ドキュメント フィールド名を指定します。

BsonRepresentation

MongoDB が値を保存するために使用するBSONタイプを指定します。 この注釈は、データクラスプロパティとは異なるBSON型として値を保存する必要がある場合にのみ使用してください。

警告: BsonRepresentationデータクラスプロパティと同じ型として保存しているプロパティに アノテーションを含めると、コードで例外がスローされる可能性があります。

これらのプロパティ注釈の詳細については、 を参照してください: org.bson.codecs.pojo.annotationsパッケージAPIドキュメント。

このセクションのコード例では、ネットワーク デバイスを記述する次のサンプル データ クラスを参照します。

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

次のコードに示すように、 NetworkDeviceインスタンスを挿入できます。

val ntwkColl = database.getCollection<NetworkDevice>("network_devices")
val deviceId = ObjectId().toHexString()
val device = NetworkDevice(deviceId, "Enterprise Wi-fi", "router")
ntwkColl.insertOne(device)

MongoDB に挿入されたドキュメントは次のようになります。

{
"_id": {...},
"name": "Enterprise Wi-fi",
"type": "router"
}

次のコードに示すように、ドキュメントをNetworkDeviceインスタンスとして取得し、印刷できます。

val annotatedClassResult = ntwkColl.find().toList()
println(annotatedClassResult)
[NetworkDevice(deviceId=..., name=Enterprise Wi-fi, deviceType=router)]

ドライバーは、ランタイム再帰を発生させずに、再帰的に定義されたデータクラスのエンコードとデコードをネイティブでサポートしています。 このサポートは、型定義内の複数のデータ クラス タイプのサイクルに拡張されます。 次のコードは、再帰データ クラスの設計の例を示しています。

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

再帰的に定義されたデータ クラスでは、他のデータ クラスと同じ方法で読み取りおよび書込み操作を実行できます。 次のコードは、DataClassTree 型のコレクションに対して検索操作を実行する方法を示しています。

val treeColl = database.getCollection<DataClassTree>("language_trees")
val treeFilter = Filters.eq("left.left.right.content", "high german")
val treeResult = treeColl.find(treeFilter).firstOrNull()
println(treeResult)
DataClassTree(content=indo-european,
left=DataClassTree(content=germanic, left=DataClassTree(...)),
right=DataClassTree(content=romance, ...))