文档数据格式:POJO
概述
在本指南中,您可以了解如何存储和检索由普通Java对象(POJO)建模的数据。POJO通常用于数据封装,即将业务逻辑与数据表示分离的实践。
提示
要了解更多关于POJO的信息,请参阅普通Java对象 维基百科文章。
本指南中的示例演示了以下任务
配置驱动程序以序列化和反序列化POJO
执行使用由POJO建模的数据的CRUD操作
示例 POJO
本指南的各节使用以下示例POJO类,该类描述了花卉的特征
public class Flower { private ObjectId id; private String name; private List<String> colors; private Boolean isBlooming; private Float height; // public empty constructor needed for retrieving the POJO public Flower() { } public Flower(String name, Boolean isBlooming, Float height, List<String> colors) { this.name = name; this.isBlooming = isBlooming; this.height = height; this.colors = colors; } public ObjectId getId() { return id; } public void setId(ObjectId id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Boolean getIsBlooming() { return isBlooming; } public void setIsBlooming(Boolean isBlooming) { this.isBlooming = isBlooming; } public Float getHeight() { return height; } public void setHeight(Float height) { this.height = height; } public List<String> getColors() { return colors; } public void setColors(List<String> colors) { this.colors = colors; } public String toString() { return "\nFlower {\n\tid: " + id + "\n\tname: " + name + "\n\tcolors: " + colors + "\n\tisBlooming: " + isBlooming + "\n\theight: " + height + "\n}"; } }
当在MongoDB中定义POJO以存储和检索数据时,请遵循以下指南
POJO类不能实现接口或扩展框架中的类。
包含您希望存储和检索数据的所有字段,并确保它们没有被标记为
static
或transient
。如果你在你的POJO中使用JavaBean命名约定定义公开的getter或setter方法,则驱动程序在序列化或反序列化数据时会调用它们。如果你省略了公开属性字段的getter或setter方法,则驱动程序会直接访问或分配它们。
配置用于POJO的驱动程序
要配置驱动程序以使用POJO,你必须指定以下组件
PojoCodecProvider
实例,该实例具有编解码器,用于定义如何在POJO格式和BSON之间编码和解码数据。提供程序还指定编解码器应用于哪些POJO类或包。CodecRegistry
实例,其中包含编解码器和其他相关信息。MongoDatabase
或MongoCollection
实例,配置为使用CodecRegistry
。MongoCollection
实例,使用与TDocument
泛型类型绑定的POJO文档类创建。
执行以下步骤以满足上一节中定义的配置要求
配置
PojoCodecProvider
。在本例中,我们使用PojoCodecProvider.Builder
的automatic(true)
设置将编解码器应用于任何类及其属性。CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build(); 注意
编解码器提供程序还包括其他对象,例如
ClassModel
和Convention
实例,它们进一步定义了序列化行为。有关编解码器提供程序和自定义的更多信息,请参阅POJO自定义指南。将
PojoCodecProvider
实例添加到CodecRegistry
中。CodecRegistry
允许您指定一个或多个编解码器提供程序来编解码POJO数据。在本例中,我们调用以下方法fromRegistries()
将多个CodecRegistry
实例合并为一个实例getDefaultCodecRegistry()
从编解码器提供程序列表中检索一个CodecRegistry
实例fromProviders()
从PojoCodecProvider
创建一个CodecRegistry
实例
以下代码展示了如何实例化
CodecRegistry
// Include the following static imports before your class definition import static com.mongodb.MongoClientSettings.getDefaultCodecRegistry; import static org.bson.codecs.configuration.CodecRegistries.fromProviders; import static org.bson.codecs.configuration.CodecRegistries.fromRegistries; ... CodecRegistry pojoCodecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(pojoCodecProvider)); 配置
MongoDatabase
或MongoCollection
实例以使用CodecRegistry
中的编解码器。您可以为数据库或集合配置编解码器。在本例中,我们使用
withCodecRegistry()
方法将名为sample_pojos
的MongoDatabase
上的CodecRegistry
设置MongoClient mongoClient = MongoClients.create(uri); MongoDatabase database = mongoClient.getDatabase("sample_pojos").withCodecRegistry(pojoCodecRegistry); 将您的POJO类传递给
getCollection()
的调用,将其作为文档类参数,并指定它为MongoCollection
实例的类型参数,如下所示MongoCollection<Flower> collection = database.getCollection("flowers", Flower.class);
执行CRUD操作
一旦配置了MongoCollection
实例以使用Flower
POJO,您就可以对由POJO模式化的数据进行CRUD操作。
本例演示了如何使用Flower
POJO执行以下操作
将
Flower
的实例插入到flowers
集合中更新集合中的一个文档
删除集合中的一个文档
查找并打印集合中的所有文档
// Insert three Flower instances Flower roseFlower = new Flower("rose", false, 25.4f, Arrays.asList(new String[] {"red", "pink"})); Flower daisyFlower = new Flower("daisy", true, 21.1f, Arrays.asList(new String[] {"purple", "white"})); Flower peonyFlower = new Flower("peony", false, 19.2f, Arrays.asList(new String[] {"red", "green"})); collection.insertMany(Arrays.asList(roseFlower, daisyFlower, peonyFlower)); // Update a document collection.updateOne( Filters.lte("height", 22), Updates.addToSet("colors", "pink") ); // Delete a document collection.deleteOne(Filters.eq("name", "rose")); // Return and print all documents in the collection List<Flower> flowers = new ArrayList<>(); collection.find().into(flowers); System.out.println(flowers);
示例输出如下
[ Flower { id: 65b178ffa38ac42044ca1573 name: daisy colors: [purple, white, pink] isBlooming: true height: 21.1 }, Flower { id: 65b178ffa38ac42044ca1574 name: peony colors: [red, green] isBlooming: false height: 19.2 }]
注意
默认情况下,PojoCodecProvider
会省略POJO中设置为null
的字段。有关如何指定此行为的更多信息,请参阅POJO自定义指南。
有关本节中提到的方法和类的更多信息,请参阅以下API文档
摘要
本指南描述了如何通过执行以下任务在BSON和POJO格式之间转换数据:
实例化一个包含如何编码和解码BSON和POJO字段之间数据的编解码器的
PojoCodecProvider
。指定
PojoCodecProvider
的 自动 转换行为,将Codecs
应用于任何类及其属性。将
PojoCodecProvider
添加到CodecRegistry
,并在MongoDatabase
或MongoCollection
的实例上指定该注册表。执行使用示例POJO类的CRUD操作。