Docs 菜单
Docs 主页
/ / /
Kotlin Sync 驱动程序
/

文档数据格式:数据类

在此页面上

  • Overview
  • 对数据类进行序列化和反序列化
  • 数据类示例
  • 插入数据类
  • 检索数据类
  • 使用注释指定组件转换
  • 带注解的数据类示例
  • 插入带注解的数据类
  • 检索带注解的数据类
  • 使用递归类型的操作

在本指南中,您可以学习;了解如何使用Kotlin数据类在MongoDB Kotlin Sync驱动程序中存储和检索数据。

该驾驶员本身支持使用默认编解码器注册表对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 result = collection.find().firstOrNull()
println("${result}")
DataStorage(productName=tape, capacity=5.0)

提示

构建器方法和数据类属性

通过向应用程序添加可选的Kotlin Sync驾驶员扩展依赖项,您可以直接将构建器类中的方法与数据类属性一起使用。 要学习;了解详情和查看示例,请参阅 《结合使用构建器与数据类》指南。

您必须为从集合返回的文档指定一个类,即使它与您在检索集合时指定的类不同。

以下示例对上一示例中由 DataStorage 数据类表示的文档执行更新,并将更新后的文档作为 DataStorageAlt 类型返回。 该操作将 releaseDate字段添加到 name字段值为 tape 的文档中:

// 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, ...))

后退

专用数据格式