执行批量操作
的bulkWrite()
方法可以对单个集合执行批量写入操作。此方法减少了从您的应用程序到MongoDB实例的网络往返次数,从而提高了应用程序的性能。由于您只有在所有操作返回后才会收到成功状态,我们建议在满足您的用例需求时使用此方法。
您可以在 bulkWrite()
中指定以下一个或多个写入操作:
insertOne
updateOne
updateMany
deleteOne
deleteMany
replaceOne
bulkWrite()
方法接受以下参数:
一个实现
WriteModel
的对象列表:实现WriteModel
的类对应于上述写入操作。例如,InsertOneModel
类封装了insertOne
写入操作。有关每个类的更多信息,请参阅页面底部的API文档链接。BulkWriteOptions
:一个可选对象,用于指定设置,例如是否确保您的MongoDB实例按顺序执行写入操作。
注意
除非包含一个或多个UpdateManyModel
或 DeleteManyModel
实例,否则在MongoDB服务器版本3.6或更高版本的批量写入操作中运行可重试的写入。
提示
默认情况下,MongoDB按照指定的顺序逐个执行批量写入操作(即串行)。在有序的批量写入过程中,如果在处理操作时发生错误,MongoDB将返回而不处理列表中剩余的操作。相比之下,当将 ordered
设置为 false
时,如果在处理过程中发生错误,MongoDB将继续处理列表中剩余的写入操作。无序操作理论上更快,因为MongoDB可以并行执行它们,但您只能在写入操作不依赖于顺序的情况下使用它们。
bulkWrite()
方法返回一个包含写入操作结果信息的 BulkWriteResult
对象,包括插入、修改和删除的文档数。
如果您的操作尝试设置一个违反您的集合唯一索引的值,则会引发一个异常,其外观可能如下所示:
The bulk write operation failed due to an error: Bulk write operation error on server <hostname>. Write errors: [BulkWriteError{index=0, code=11000, message='E11000 duplicate key error collection: ... }].
同样,如果您尝试对使用模式验证的集合执行批量写入,并且您的写入操作提供了意外的格式,您可能会遇到异常。
示例
以下代码示例在 sample_mflix
数据库中的 movies
集合上执行有序的批量写入操作。示例调用 bulkWrite()
包含了 InsertOneModel
、UpdateOneModel
和 DeleteOneModel
的示例。
注意
此示例使用连接URI连接到MongoDB的一个实例。有关连接到您的MongoDB实例的更多信息,请参阅连接指南.
import com.mongodb.MongoException import com.mongodb.client.model.DeleteOneModel import com.mongodb.client.model.Filters import com.mongodb.client.model.InsertOneModel import com.mongodb.client.model.ReplaceOneModel import com.mongodb.client.model.UpdateOneModel import com.mongodb.client.model.UpdateOptions import com.mongodb.client.model.Updates import com.mongodb.kotlin.client.coroutine.MongoClient import kotlinx.coroutines.runBlocking data class Movie(val title: String, val runtime: Int? = null) fun main() = runBlocking { // Replace the uri string with your MongoDB deployment's connection string val uri = "<connection string uri>" val mongoClient = MongoClient.create(uri) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Movie>("movies") try { val result = collection.bulkWrite( listOf( InsertOneModel(Movie("A Sample Movie")), InsertOneModel(Movie("Another Sample Movie")), InsertOneModel(Movie("Yet Another Sample Movie")), UpdateOneModel( Filters.eq(Movie::title.name,"A Sample Movie"), Updates.set(Movie::title.name, "An Old Sample Movie"), UpdateOptions().upsert(true) ), DeleteOneModel(Filters.eq("title", "Another Sample Movie")), ReplaceOneModel( Filters.eq(Movie::title.name, "Yet Another Sample Movie"), Movie("The Other Sample Movie", 42) ) ) ) println( """ Result statistics: inserted: ${result.insertedCount} updated: ${result.modifiedCount} deleted: ${result.deletedCount} """.trimIndent() ) } catch (e: MongoException) { System.err.println("The bulk write operation failed due to an error: $e") } mongoClient.close() }
Result statistics: inserted: 3 updated: 2 deleted: 1
关于本页面上提到的类和方法,请参阅以下资源
唯一索引 服务器手册条目
模式验证 服务器手册条目
bulkWrite() API 文档
BulkWriteOptions API 文档
BulkWriteResult API 文档
InsertOneModel API 文档
UpdateOneModel API 文档
UpdateManyModel API 文档
DeleteOneModel API 文档
DeleteManyModel API 文档
ReplaceOneModel API 文档