插入文档
概述
在本指南中,您可以学习如何使用 Java Reactive Streams 驱动程序通过执行插入操作将文档添加到 MongoDB 集合中。
插入操作将一个或多个文档插入到 MongoDB 集合中。您可以使用insertOne()
或 insertMany()
方法执行插入操作。
示例数据
本指南中的示例使用来自Atlas 示例数据集的 sample_restaurants.restaurants
集合。.
要了解如何创建免费的 MongoDB Atlas 集群和加载数据集,请参阅入门教程。
重要
项目 Reactor 库
本指南使用 Project Reactor 库来消费由 Java 反应式流驱动程序方法返回的 Publisher
实例。要了解更多关于 Project Reactor 库及其使用方法,请参阅 Reactor 文档中的 入门。要了解更多关于本指南中如何使用 Project Reactor 库方法,请参阅 将数据写入 MongoDB 指南。
字段 _id
在 MongoDB 集合中,每个文档都必须包含一个具有唯一字段值的 _id
字段。
MongoDB 允许您以两种方式管理此字段
您可以自己为每个文档设置此字段,确保每个
_id
字段值都是唯一的。您可以允许驱动程序自动为每个文档的
_id
字段生成唯一的ObjectId
值。如果您未手动设置文档的_id
值,则驱动程序会使用ObjectId
填充字段。
除非您能保证唯一性,否则我们建议让驱动程序自动生成 _id
值。
注意
重复的 _id
值违反了唯一索引约束,这会导致驱动程序从 insertOne()
返回 WriteError
或从 insertMany()
返回 BulkWriteError
。
要了解更多关于 _id
字段的信息,请参阅 MongoDB 服务器手册中的 唯一索引 指南。
要了解文档结构和规则的更多信息,请参阅 MongoDB 服务器手册中的文档指南。
插入一个文档
要将单个文档添加到 MongoDB 集合中,调用 insertOne()
方法并传递您要添加的文档。然后,将 insertOne()
结果传递给来自 Mono
的静态 Mono.from()
方法。Mono
是 Project Reactor 库中的一个类。在 Java Reactive Streams 中,驱动方法返回冷 Publisher
实例,这意味着相应的操作不会发生,除非您订阅返回的 Publisher
。本指南使用 Project Reactor 库来消费它们。有关 Mono
的更多信息,请参阅 Project Reactor 文档中的Mono。
以下示例使用 insertOne()
方法在 restaurants
集合中插入一个名为 "Mongo's Burgers"
的文档。
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响应式流中,驱动程序方法返回冷Publisher
实例,这意味着除非你订阅返回的Publisher
,否则相应的操作不会发生。本指南使用Project Reactor库来消费它们。有关Mono
的更多信息,请参阅Project 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()
方法。所有方法都是可选的。
方法 | 描述 |
---|---|
bypassDocumentValidation (Boolean bypassDocumentValidation) | 如果设置为 True ,允许写入操作跳过文档级验证。默认为 False 。 |
toString() | 如果使用,则返回对象的字符串表示形式。 |
comment(BsonValue comment) | 附加到操作上的注释。有关更多信息,请参阅 MongoDB 服务器手册中的插入命令字段指南。 |
InsertManyOptions
类包含前面提到的所有方法,以及以下 ordered()
方法
方法 | 描述 |
---|---|
ordered(Boolean ordered) | 如果设置为 True ,驱动程序将按提供的顺序将文档发送到服务器。如果发生错误,驱动程序和服务器将取消所有剩余的插入操作。默认为 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 文档