POJO CRUD操作示例
在此页面上
本指南使用普通旧Java对象 (POJO) 来对文档进行建模,而不是使用通用的 Document
类。
本指南中的代码示例来自 PojoQuickTour.java 驱动程序源代码Github 存储库中的文件。
重要
本指南使用自定义Subscriber
实现,如自定义订阅者实现示例指南中所述。
先决条件
您必须设置以下组件才能运行本指南中的代码示例:
在 MongoDB 默认端口 (
27017
) 上运行的 MongoDB 服务器项目中安装的驱动程序依赖项
以下 import 语句:
import com.mongodb.client.result.InsertOneResult; import com.mongodb.client.result.InsertManyResult; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.MongoDatabase; import org.bson.codecs.configuration.CodecRegistry; import org.bson.codecs.pojo.PojoCodecProvider; import java.util.List; import static com.mongodb.client.model.Filters.*; import static com.mongodb.client.model.Updates.*; import static java.util.Arrays.asList; import static org.bson.codecs.configuration.CodecRegistries.fromProviders; import static org.bson.codecs.configuration.CodecRegistries.fromRegistries; POJO 类定义。 从Github上的驱动程序源代码存储库复制
Person
和Address
POJO 的完整代码:
创建自定义 CodecRegistry
在将 POJO 与驾驶员一起使用之前,您需要配置CodecRegistry
以包含一个编解码器,该编解码器可以处理 POJO 与BSON之间的转换。 最简单的方法是使用PojoCodecProvider.builder()
方法创建和配置CodecProvider
。
以下示例将默认编解码器注册表与配置的PojoCodecProvider
相结合,以自动创建 POJO Codec
实例:
CodecRegistry pojoCodecRegistry = fromRegistries( MongoClientSettings.getDefaultCodecRegistry(), fromProviders(PojoCodecProvider.builder().automatic(true).build()) );
注意
按顺序检查注册表,直到返回所请求类的编解码器为止。 DefaultCodecRegistry
应位于列表的第一个,而PojoCodecProvider
应始终位于最后一个CodecProvider
,因为它几乎可以为任何类提供编解码器。
使用 CodecRegistry
以下列表描述了设置pojoCodecRegistry
以供使用的方法:
在实例化
MongoClient
对象时进行设置:MongoClientSettings settings = MongoClientSettings.builder() .codecRegistry(pojoCodecRegistry) .build(); MongoClient mongoClient = MongoClients.create(settings); 使用带有 的替代
CodecRegistry
MongoDatabase
:database = database.withCodecRegistry(pojoCodecRegistry); 使用带有 的替代
CodecRegistry
MongoCollection
:collection = collection.withCodecRegistry(pojoCodecRegistry);
将 POJO 插入 MongoDB
编解码器注册表会自动尝试为未知类创建 POJO Codec
。 这允许您开箱即用 POJO,无需任何额外的配置。
在将 POJO 插入 MongoDB 之前,请先创建一个配置有 POJO 类的MongoCollection
实例:
MongoCollection<Person> collection = database.getCollection("people", Person.class);
插入 Person 实例
要将Person
插入集合中,请使用集合的insertOne()
方法:
Person ada = new Person("Ada Byron", 20, new Address("St James Square", "London", "W1")); collection.insertOne(ada).subscribe(new OperationSubscriber<InsertOneResult>());
插入多个 Person 实例
要插入多个Person
实例,可以使用集合的insertMany()
方法,该方法将Person
实例列表作为参数。
以下示例将向集合添加多个Person
实例:
List<Person> people = asList( new Person("Charles Babbage", 45, new Address("5 Devonshire Street", "London", "W11")), new Person("Alan Turing", 28, new Address("Bletchley Hall", "Bletchley Park", "MK12")), new Person("Timothy Berners-Lee", 61, new Address("Colehill", "Wimborne", null)) ); collection.insertMany(people).subscribe(new OperationSubscriber<InsertManyResult>());
查询集合
要查询集合,可以使用find()
方法。
以下示例将打印集合中的所有Person
实例:
collection.find().subscribe(new PrintToStringSubscriber<>());
Person{id='...', name='Ada Byron', age=20, address=Address{street='St James Square', city='London', zip='W1'}} Person{id='...', name='Charles Babbage', age=45, address=Address{street='5 Devonshire Street', city='London', zip='W11'}} Person{id='...', name='Alan Turing', age=28, address=Address{street='Bletchley Hall', city='Bletchley Park', zip='MK12'}} Person{id='...', name='Timothy Berners-Lee', age=61, address=Address{street='Colehill', city='Wimborne', zip='null'}}
指定查询筛选器
要查询匹配特定条件的Person
实例,请将筛选器对象传递给find()
方法。 为了便于创建筛选器对象,驱动程序提供了Filters
辅助方法。
重要
查询 POJO 时,必须查询文档字段名称,而不是 POJO属性名称。 默认,它们是相同的,但可以更改 POJO属性名称的映射方式。
获取与筛选器匹配的人员
以下示例通过传递eq()
筛选器对象来指定相等条件,从而在数据库中查找address.city
值为Wimborne
的第一个Person
:
collection.find(eq("address.city", "Wimborne")) .first() .subscribe(new PrintToStringSubscriber<>());
Person{id='591dbc2550852fa685b3ad1a', name='Timothy Berners-Lee', age=61, address=Address{street='Colehill', city='Wimborne', zip='null'}}
获取与筛选器匹配的所有 Person 实例
以下示例打印age
值大于30
的每个文档:
collection.find(gt("age", 30)).subscribe(new PrintToStringSubscriber<>());
Update Documents
要更新集合中的文档,可以使用集合的updateOne()
和updateMany()
方法。
将以下参数传递给这些方法:
筛选对象以确定要更新的一个或多个文档。 要指定空过滤器并匹配所有
Person
实例,请使用空Document
对象。
更新方法返回UpdateResult
类型,其中提供有关操作的信息,包括更新修改的文档数量。
更新单个人员
要更新单个Person
,请使用updateOne()
方法。
Person
"Ada Byron"
以下示例通过将年龄设置为23
并将名称设置为 来更新名为"Ada Lovelace"
的 :
collection.updateOne( eq("name", "Ada Byron"), combine(set("age", 23), set("name", "Ada Lovelace")) ).subscribe(new OperationSubscriber<>());
更新多人实例
要更新与筛选器匹配的所有Person
实例,请使用updateMany()
方法。
以下示例将所有具有zip
值的文档的zip
字段设置为null
:
collection.updateMany(not(eq("zip", null)), set("zip", null)) .subscribe(new OperationSubscriber<>());
替换单个人员
更改现有Person
实例的另一种方法是使用replaceOne()
方法。
以下示例将名为"Ada Lovelace"
的Person
替换为前面 insertOne 示例中ada
变量引用的Person
实例:
collection.replaceOne(eq("name", "Ada Lovelace"), ada) .subscribe(new OperationSubscriber<>());
Delete Documents
要从集合中删除文档,可以使用集合的deleteOne()
和deleteMany()
方法。
传递过滤对象以匹配要删除的一个或多个文档。 要指定空过滤,请使用空Document
对象。
删除方法返回DeleteResult
类型,其中提供有关操作的信息,包括删除的文档数。
删除与筛选器匹配的单个人员
要删除与过滤器匹配的单个Person
,请使用deleteOne()
方法。
以下示例删除一个Person
address.city
值为Wimborne
:
collection.deleteOne(eq("address.city", "Wimborne")) .subscribe(new OperationSubscriber<>());
删除与筛选器匹配的所有人员实例
要删除与筛选器匹配的多个Person
实例,请使用deleteMany()
方法。
以下示例删除address.city
值为London
的所有Person
实例:
collection.deleteMany(eq("address.city", "London")) .subscribe(new OperationSubscriber<>());