Overview
在本指南中,您可以学习如何使用Java Reactive Streams驱动程序通过执行插入操作将文档添加到MongoDB集合。
插入操作将一个或多个文档插入MongoDB集合。 您可以使用 insertOne()或insertMany()方法执行插入操作。
样本数据
本指南中的示例使用 Atlas 示例数据集 中的 sample_restaurants.restaurants 集合。
要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅入门教程。
重要
项目 Reactor 库
本指南使用 Project Reactor 库来使用Java Reactive Streams驱动程序方法返回的 Publisher 实例。要学习;了解有关 Project Reactor 库及其使用方法的更多信息,请参阅 Reactor 文档中的入门。要进一步学习;了解如何使用本指南中的 Project Reactor 库方法,请参阅“将数据写入MongoDB”指南。
字段 _id
在 MongoDB 集合中,每个文档必须包含具有唯一字段值的 _id 字段。
MongoDB 允许您通过两种方式管理该字段:
您可以自行为每个文档设置此字段,确保每个
_id字段的值都是唯一的。您可以让驱动程序自动为每个文档
_id生成唯一的ObjectId值。 如果您没有为文档手动设置_id值,驱动程序将使用ObjectId填充该字段。
除非您可以保证唯一性,否则我们建议让驱动程序自动生成_id值。
注意
重复的 _id 值违反了唯一索引约束条件,会导致驱动程序从 insertOne() 返回 WriteError,或从 insertMany() 返回 BulkWriteError。
要了解有关_id字段的更多信息,请参阅 MongoDB Server 手册中的唯一索引指南。
要了解有关文档结构和规则的更多信息,请参阅 MongoDB Server 手册中的文档指南。
插入一个文档
要将单个文档添加到MongoDB集合,请调用 insertOne() 方法并传递要添加的文档。然后,将 insertOne() 结果传递给 Mono 中的静态 Mono.from() 方法。 Mono 是 Project Reactor 库中的一个类。在Java Reactive Streams 中,驱动程序方法会返回 Publisher 冷实例,这意味着除非您订阅返回的 Publisher,否则不会发生相应的操作。本指南使用 项目 Reactor 库来使用它们。要学习;了解有关Mono 的更多信息,请参阅 项目 Reactor 文档中的 Mono。
以下示例使用insertOne()方法将name值为"Mongo's
Burgers"的文档插入到restaurants集合中:
Document document = new Document("name", "Mongo's Burgers"); Publisher<InsertOneResult> insertPublisher = restaurants.insertOne(document); Mono.from(insertPublisher).block();
插入多个文档
要将多个文档添加到MongoDB集合,请调用 insertMany() 方法并传递要添加的文档列表。然后,将 insertMany() 结果传递给 Mono 中的静态 Mono.from() 方法。 Mono 是 Project Reactor 库中的一个类。在Java Reactive Streams 中,驱动程序方法会返回 Publisher 冷实例,这意味着除非您订阅返回的 Publisher,否则不会发生相应的操作。本指南使用 项目 Reactor 库来使用它们。要学习;了解有关Mono 的更多信息,请参阅 项目 Reactor 文档中的 Mono。
以下示例使用insertMany()方法将文档列表插入到restaurants集合中:
Document doc1 = new Document("name", "Mongo's Pizza"); Document doc2 = new Document("name", "Mongo's Coffee"); List<Document> documents = Arrays.asList(doc1, doc2); Publisher<InsertManyResult> insertPublisher = restaurants.insertMany(documents); Mono.from(insertPublisher).block();
修改插入行为
InsertOneOptions类包含修改insertOne()方法行为的方法。 要使用InsertOneOptions类,请构造该类的新实例,然后调用其一个或多个方法来修改插入操作。 您可以将这些方法调用链接在一起。 要修改插入操作的行为,请将类实例和链式方法调用作为第二个参数传递给insertOne()方法。
您可以使用InsertManyOptions类以类似方式修改insertMany()方法。
您可以使用InsertOneOptions类中的以下方法来修改insertOne()方法。 所有方法都是可选的。
方法 | 说明 |
|---|---|
| If set to True, allows the write to opt out of
document-level validation.Defaults to False. |
| If used, returns a string representation of the object. |
| A comment to attach to the operation. For more information, see the insert command
fields guide in the
MongoDB Server manual. |
InsertManyOptions类包含前面的方法,以及以下ordered()方法:
方法 | 说明 |
|---|---|
| If set to True, the driver sends documents to the
server in the order provided. If an error occurs, the driver
and server cancel all remaining insert operations.Defaults to True. |
例子
以下代码使用insertMany()方法将新文档插入到restaurants集合中。 它还将bypassDocumentValidation(true)选项设置为 ,以绕过文档级验证。
Document doc1 = new Document("name", "Mongo's Burgers"); Document doc2 = new Document("name", "Mongo's Pizza"); Document doc3 = new Document("name", "Mongo's Coffee"); List<Document> documents = Arrays.asList(doc1, doc2, doc3); Publisher<InsertManyResult> insertPublisher = restaurants.insertMany(documents, new InsertManyOptions().bypassDocumentValidation(true)); Mono.from(insertPublisher).block();
更多信息
有关使用Java Reactive Streams驱动程序插入文档的可运行代码示例,请参阅写入数据到MongoDB指南。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: