文档菜单
文档首页
/ / /
Kotlin 协程
/

执行批量操作

bulkWrite() 方法可以对单个集合执行批量写入操作。此方法减少了从您的应用程序到MongoDB实例的网络往返次数,从而提高了应用程序的性能。由于您只有在所有操作返回后才会收到成功状态,我们建议在满足您的用例需求时使用此方法。

您可以在 bulkWrite() 中指定以下一个或多个写入操作:

  • insertOne

  • updateOne

  • updateMany

  • deleteOne

  • deleteMany

  • replaceOne

bulkWrite() 方法接受以下参数:

  • 一个实现 WriteModel 的对象列表:实现 WriteModel 的类对应于上述写入操作。例如,InsertOneModel 类封装了 insertOne 写入操作。有关每个类的更多信息,请参阅页面底部的API文档链接。

  • BulkWriteOptions:一个可选对象,用于指定设置,例如是否确保您的MongoDB实例按顺序执行写入操作。

注意

除非包含一个或多个UpdateManyModelDeleteManyModel 实例,否则在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() 包含了 InsertOneModelUpdateOneModelDeleteOneModel 的示例。

注意

此示例使用连接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 文档

返回

删除多个