Docs 菜单
Docs 主页
/ / /
Kotlin Sync 驱动程序
/

批量写入操作

在此页面上

  • 概述
  • 样本数据
  • 定义写入操作
  • 插入操作
  • 更新操作
  • 替换操作
  • 删除操作
  • 执行批量操作
  • 自定义批量写入操作
  • 返回值
  • 更多信息
  • API 文档

本指南向您展示如何使用 Kotlin Sync 驱动程序执行批量写入操作,从而在单个数据库调用中对数据进行多项更改。

考虑需要为同一任务插入文档、更新文档和删除文档的情况。如果使用单独的写入方法执行每种类型的操作,则每次写入都会单独访问数据库。您可以使用批量写入操作来优化应用程序对服务器的调用次数。

本指南中的示例使用 Atlas 样本数据集中 sample_restaurants.restaurants集合。要了解如何创建免费的 MongoDB Atlas 集群并加载样本数据集,请参阅Atlas 入门指南。

此集合中的文档由以下 Kotlin 数据类建模:

data class Restaurant(
val name: String,
val borough: String,
val cuisine: String
)

对于您要执行的每个写入操作,创建以下操作类之一的相应实例,这些操作类从通用WriteModel类继承:

  • InsertOneModel

  • UpdateOneModel

  • UpdateManyModel

  • ReplaceOneModel

  • DeleteOneModel

  • DeleteManyModel

然后,将这些实例的列表传递给bulkWrite()方法。

以下部分介绍如何创建和使用上述类的实例。执行批量操作部分演示了如何将模型列表传递给bulkWrite()方法以执行批量操作。

要执行插入操作,请创建一个InsertOneModel实例并指定要插入的文档。

以下示例创建了一个InsertOneModel实例:

val blueMoon = InsertOneModel(Restaurant("Blue Moon Grill", "Brooklyn", "American"))

要插入多个文档,请为每个文档创建一个InsertOneModel实例。

重要

执行批量操作时, InsertOneModel无法插入集合中已存在的具有_id的文档。在这种情况下,驱动程序会抛出MongoBulkWriteException

要更新文档,请创建UpdateOneModel的实例并传递以下参数:

  • 查询筛选器,用于指定匹配集合中文档的条件

  • 要执行的更新操作。有关更新操作的更多信息,请参阅 MongoDB Server 手册中的字段更新操作符指南。

UpdateOneModel实例指定与查询筛选器匹配的第一个文档的更新。

以下示例创建了一个UpdateOneModel实例:

val updateOneFilter = Filters.eq(Restaurant::name.name, "White Horse Tavern")
val updateOneDoc = Updates.set(Restaurant::borough.name, "Queens")
val tavernUpdate = UpdateOneModel<Restaurant>(updateOneFilter, updateOneDoc)

要更新多个文档,请创建UpdateManyModel的实例并传递与UpdateOneModel相同的参数。 UpdateManyModel类指定与查询筛选器匹配的所有文档的更新。

以下示例创建了一个UpdateManyModel实例:

val updateManyFilter = Filters.eq(Restaurant::name.name, "Wendy's")
val updateManyDoc = Updates.set(Restaurant::cuisine.name, "Fast food")
val wendysUpdate = UpdateManyModel<Restaurant>(updateManyFilter, updateManyDoc)

替换操作会删除指定文档的所有字段和值,并将其替换为您指定的新字段和值。要执行替换操作,请创建ReplaceOneModel实例并传递查询筛选器以及要用于替换匹配文档的字段和值。

以下示例创建了一个ReplaceOneModel实例:

val replaceFilter = Filters.eq(Restaurant::name.name, "Cooper Town Diner")
val replaceDoc = Restaurant("Smith Town Diner", "Brooklyn", "American")
val replacement = ReplaceOneModel(replaceFilter, replaceDoc)

要替换多个文档,必须为每个文档创建一个ReplaceOneModel实例。

要删除文档,请创建DeleteOneModel实例并传递查询筛选器,指定要删除的文档。 DeleteOneModel实例提供了仅删除与查询筛选器匹配的第一个文档的说明。

以下示例创建了一个DeleteOneModel实例:

val deleteOne = DeleteOneModel<Restaurant>(Filters.eq(
Restaurant::name.name,
"Morris Park Bake Shop"
))

要删除多个文档,请创建DeleteManyModel实例并传递查询筛选器,指定要删除的文档。 DeleteManyModel的实例提供了删除与查询筛选器匹配的所有文档的说明。

以下示例创建了一个DeleteManyModel实例:

val deleteMany = DeleteManyModel<Restaurant>(Filters.eq(
Restaurant::cuisine.name,
"Experimental"
))

为要执行的每个操作定义模型实例后,将这些实例的列表传递给bulkWrite()方法。默认情况下,该方法按照模型列表指定的顺序运行操作。

以下示例使用bulkWrite()方法执行多个写入操作:

val insertOneMdl = InsertOneModel(Restaurant("Red's Pizza", "Brooklyn", "Pizzeria"))
val updateOneMdl = UpdateOneModel<Restaurant>(
Filters.eq(Restaurant::name.name, "Moonlit Tavern"),
Updates.set(Restaurant::borough.name, "Queens")
)
val deleteManyMdl = DeleteManyModel<Restaurant>(
Filters.eq(Restaurant::name.name, "Crepe")
)
val bulkResult = collection.bulkWrite(
listOf(insertOneMdl, updateOneMdl, deleteManyMdl)
)
println(bulkResult)
AcknowledgedBulkWriteResult{insertedCount=1, matchedCount=5, removedCount=3,
modifiedCount=2, upserts=[], inserts=[BulkWriteInsert{index=0,
id=BsonObjectId{value=...}}]}

如果任何写入操作失败,Kotlin Sync 驱动程序都会引发BulkWriteError ,并且不会执行任何进一步的操作。 BulkWriteError提供details项,其中包括失败的操作以及有关异常的详细信息。

注意

当驱动程序运行批量操作时,它会使用目标集合的写关注。无论执行顺序如何,驱动程序在尝试所有操作后都会报告所有写关注错误。

bulkWrite()方法可以选择接受一个参数,该参数指定可用于配置批量写入操作的选项。如果不指定任何选项,驱动程序将使用默认设置执行批量操作。

下表描述了可用于配置BulkWriteOptions实例的 setter 方法:

属性
说明
ordered()
If true, the driver performs the write operations in the order provided. If an error occurs, the remaining operations are not attempted.

If false, the driver performs the operations in an arbitrary order and attempts to perform all operations.
Defaults to true.
bypassDocumentValidation()
Specifies whether the update operation bypasses document validation. This lets you update documents that don't meet the schema validation requirements, if any exist. For more information about schema validation, see Schema Validation in the MongoDB Server manual.
Defaults to false.
comment()
Sets a comment to attach to the operation.
let()
Provides a map of parameter names and values to set top-level variables for the operation. Values must be constant or closed expressions that don't reference document fields.

以下代码创建选项并使用ordered(false)选项指定无序批量写入。然后,该示例使用bulkWrite()方法执行批量操作:

val opts = BulkWriteOptions().ordered(false)
collection.bulkWrite(bulkOperations, opts)

如果无序批量写入中的任何写入操作失败,Kotlin Sync 驱动程序仅在尝试所有操作后才会报告错误。

注意

无序批量操作不保证执行顺序。为了优化运行时间,顺序可以与您列出的方式不同。

bulkWrite()方法返回一个BulkWriteResult对象。您可以从BulkWriteResult实例访问以下信息:

属性
说明
wasAcknowledged()
Indicates if the server acknowledged the write operation.
getDeletedCount()
The number of documents deleted, if any.
getInsertedCount()
The number of documents inserted, if any.
getInserts()
The list of inserted documents, if any.
getMatchedCount()
The number of documents matched for an update, if applicable.
getModifiedCount()
The number of documents modified, if any.
getUpserts()
The list of upserted documents, if any.

要了解如何执行单个写入操作,请参阅以下指南:

  • 插入文档

  • 更新文档

  • 删除文档

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

后退

删除文档

来年

从 MongoDB 读取数据