文档数据格式:记录
Overview
在本指南中,您可以了解如何使用 Java 记录在 MongoDB Java 驱动程序中存储和检索数据。Java 记录是一种 Java 类,通常用于对数据建模并将业务逻辑与数据表示分开。
提示
您可以在 Java 16 或更高版本中声明 Java 记录。有关记录功能和限制的详情,请参阅 Java 17 语言更新:记录类别。
如果您使用的是早期版本的Java,则可以改用普通的旧Java对象。 有关实施详情,请参阅文档数据格式:POJO指南。
注意
如果您在 OSGi 容器中使用该驱动程序,并且您的应用程序使用该驱动程序对 Java 记录进行编码或解码,则必须添加对 org.bson.codecs.record
模块的显式依赖项。 在 IBM OSGi 文档中了解有关为 OSGi 容器定义依赖项的更多信息。
对记录进行序列化和反序列化
该驱动程序本身支持使用默认编解码器注册表对 MongoDB 读写操作的 Java 记录进行编码和解码。默认编解码器注册表是称为编解码器的类的集合,它们定义如何转换编码和解码 Java 类型。在编解码器指南中了解有关编解码器和默认编解码器注册表的详情。
记录示例
本部分的代码示例引用了以下示例记录,其中描述了数据存储设备:
public record DataStorageRecord( String productName, double capacity ) {}
插入记录
您可以插入 DataStorageRecord
实例,如以下代码所示:
MongoCollection<DataStorageRecord> collection = database.getCollection("data_storage_devices", DataStorageRecord.class); // insert the record collection.insertOne(new DataStorageRecord("2TB SSD", 1.71));
检索记录
如以下代码所示,您可以按 DataStorageRecord
实例检索文档并打印:
MongoCollection<DataStorageRecord> collection = database.getCollection("data_storage_devices", DataStorageRecord.class); // retrieve and print the records List<DataStorageRecord> records = new ArrayList<DataStorageRecord>(); collection.find().into(records); records.forEach(System.out::println);
DataStorageRecord[productName=1TB SSD, capacity=1.71]
使用注释指定组件转换
本部分描述可用于配置记录组件序列化行为的注释,并提供示例来演示注释行为。
提示
org.bson.codecs.records.annotations
包已弃用。请使用 org.bson.codecs.pojo.annotations 包中的相应注释。
您可对记录组件使用以下注释:
注解名称 | 说明 |
---|---|
BsonId | 以 _id 属性指定要序列化的组件。 |
BsonProperty | 将记录组件转换为 BSON 时,指定自定义文档字段名称。接受字段名作为参数。 |
BsonRepresentation | 如果有别于记录组件类型,需指定要存储的 BSON 类型。接受 BSON 类型作为参数。 |
注意
驱动程序支持 Java 记录的注释,但前提是在定义组件时包含注释,如以下记录示例所示。您不能在记录构造函数中使用注释。
带注释的记录示例
本部分的代码示例引用以下示例记录,其中描述了网络设备:
import org.bson.BsonType; import org.bson.codecs.pojo.annotations.BsonProperty; import org.bson.codecs.pojo.annotations.BsonId; import org.bson.codecs.pojo.annotations.BsonRepresentation; public record NetworkDeviceRecord( @BsonId() String deviceId, String name, String deviceType ) {}
插入注释记录
您可以插入 DataStorageRecord
实例,如以下代码所示:
MongoCollection<NetworkDeviceRecord> collection = database.getCollection("network_devices", NetworkDeviceRecord.class); // insert the record String deviceId = new ObjectId().toHexString(); collection.insertOne(new NetworkDeviceRecord(deviceId, "Enterprise Wi-fi", "router"));
在 MongoDB 中插入的文档应类似于以下内容:
{ _id: ObjectId("fedc..."), name: 'Enterprise Wi-fi', type: 'router' }
检索注释记录
如以下代码所示,您可以按 NetworkDeviceRecord
实例检索文档并打印:
MongoCollection<NetworkDeviceRecord> collection = database.getCollection("network_devices", NetworkDeviceRecord.class); // return all documents in the collection as records List<NetworkDeviceRecord> records = new ArrayList<NetworkDeviceRecord>(); collection.find().into(records); records.forEach(System.out::println);
NetworkDeviceRecord[deviceId=fedc..., name=Enterprise Wi-fi, deviceType=router]
使用递归类型的操作
驱动程序本身支持对递归定义的记录进行编码和解码,而不会导致运行时递归。这种支持扩展到在类型定义的多个记录类型的循环。以下代码提供了递归记录设计的示例:
public record RecordTree( String content, RecordTree left, RecordTree right ) {}
就像对其他记录一样,您可以对递归定义的记录执行读写操作。以下代码显示如何对 RecordTree
类型的集合执行查找操作:
MongoDatabase database = mongoClient.getDatabase("myDB"); MongoCollection<RecordTree> collection = database.getCollection("myCollection", RecordTree.class); Bson filter = Filters.eq("left.left.right.content", "Ikatere"); collection.find(filter).forEach(doc -> System.out.println(doc));
RecordTree[content=Ranginui, left=RecordTree[content=..., left=RecordTree[content=..., right=RecordTree[content=Ikatere...]]
检索记录编解码器
您可以使用 RecordCodecProvider
来检索记录编解码器。如果您想自定义编解码器,将 Java 记录对象与相应的 BSON 类型进行编码和解码,同时尽量减少重复代码,则应使用此接口。要了解有关编解码器及其使用的详情,请参阅编解码器。
您无法直接创建记录编解码器,但可使用 RecordCodecProvider
在代码中实现记录编解码器。有关 RecordCodecProvider
的更多信息,请参阅 API 文档。