Docs 菜单
Docs 主页
/ / /
Java Reactive Streams 驱动程序

POJO CRUD操作示例

在此页面上

  • 先决条件
  • 创建自定义 CodecRegistry
  • 使用 CodecRegistry
  • 将 POJO 插入 MongoDB
  • 插入 Person 实例
  • 插入多个 Person 实例
  • 查询集合
  • 指定查询筛选器
  • 获取与筛选器匹配的人员
  • 获取与筛选器匹配的所有 Person 实例
  • Update Documents
  • 更新单个人员
  • 更新多人实例
  • 替换单个人员
  • Delete Documents
  • 删除与筛选器匹配的单个人员
  • 删除与筛选器匹配的所有人员实例

本指南使用普通旧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上的驱动程序源代码存储库复制 PersonAddress POJO 的完整代码:

在将 POJO 与驾驶员一起使用之前,您需要配置CodecRegistry以包含一个编解码器,该编解码器可以处理 POJO 与BSON之间的转换。 最简单的方法是使用PojoCodecProvider.builder()方法创建和配置CodecProvider

以下示例将默认编解码器注册表与配置的PojoCodecProvider相结合,以自动创建 POJO Codec实例:

CodecRegistry pojoCodecRegistry = fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build())
);

注意

按顺序检查注册表,直到返回所请求类的编解码器为止。 DefaultCodecRegistry应位于列表的第一个,而PojoCodecProvider应始终位于最后一个CodecProvider ,因为它几乎可以为任何类提供编解码器。

以下列表描述了设置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 Codec 。 这允许您开箱即用 POJO,无需任何额外的配置。

在将 POJO 插入 MongoDB 之前,请先创建一个配置有 POJO 类的MongoCollection实例:

MongoCollection<Person> collection = database.getCollection("people", Person.class);

要将Person插入集合中,请使用集合的insertOne()方法:

Person ada = new Person("Ada Byron", 20, new Address("St James Square", "London", "W1"));
collection.insertOne(ada).subscribe(new OperationSubscriber<InsertOneResult>());

要插入多个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'}}

以下示例打印age值大于30的每个文档:

collection.find(gt("age", 30)).subscribe(new PrintToStringSubscriber<>());

要更新集合中的文档,可以使用集合的updateOne()updateMany()方法。

将以下参数传递给这些方法:

  • 筛选对象以确定要更新的一个或多个文档。 要指定空过滤器并匹配所有Person实例,请使用空Document对象。

  • 更新指定修改的文档。 要查看可用操作符的列表,请参阅 MongoDB Server手册中的 更新操作符 。

更新方法返回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<>());

要从集合中删除文档,可以使用集合的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<>());

后退

验证驱动程序工件签名