插入文档
Overview
在本指南中,您可以学习;了解如何使用Java Reactive Streams驾驶员通过执行插入操作将文档添加到MongoDB集合。
插入操作将一个或多个文档插入MongoDB集合。 您可以使用 insertOne()
或insertMany()
方法执行插入操作。
样本数据
本指南中的示例使用 Atlas 示例数据集 中的 sample_restaurants.restaurants
集合。
要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅入门教程。
重要
项目 Reactor 库
本指南使用 Project ReactorPublisher
库来使用Java Reactive Streams驾驶员方法返回的 实例。要学习;了解有关 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.from()
Mono
方法。Mono
是 Project Reactor 库中的一个类。在Java Reactive Streams 中,驾驶员方法会返回Publisher
冷实例,这意味着除非您订阅返回的Publisher
,否则不会发生相应的操作。 本指南使用 Project Reactor 库来使用它们。 要学习;了解有关Mono
的更多信息,请参阅 Mono 在 Project Reactor 文档中。
以下示例使用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.from()
Mono
方法。Mono
是 Project Reactor 库中的一个类。在Java Reactive Streams 中,驾驶员方法会返回Publisher
冷实例,这意味着除非您订阅返回的Publisher
,否则不会发生相应的操作。 本指南使用 Project Reactor 库来使用它们。 要学习;了解有关Mono
的更多信息,请参阅 Mono 在 Project Reactor 文档中。
以下示例使用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) | If set to True , allows the write to opt out of
document-level validation.Defaults to False . |
toString() | If used, returns a string representation of the object. |
comment(BsonValue comment) | A comment to attach to the operation. For more information, see the insert command
fields guide in the
MongoDB Server manual. |
InsertManyOptions
类包含前面的方法,以及以下ordered()
方法:
方法 | 说明 |
---|---|
ordered(Boolean 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驾驶员插入文档的可运行代码示例,请参阅Write Data to MongoDB指南。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: