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

更新文档

您可以使用 updateOne() 方法在 MongoCollection 对象上更新单个文档。此方法接受一个 过滤器,用于匹配您想要更新的文档,以及一个 更新 语句,指示驱动程序如何更改匹配的文档。updateOne() 方法仅更新与过滤器匹配的第一个文档。要使用 updateOne() 方法执行更新,您必须传递一个查询过滤器和更新文档。查询过滤器指定要更新哪个文档的条件,更新文档提供有关对其进行什么更改的说明。

要使用 updateOne() 方法执行更新,您必须传递一个查询过滤器和更新文档。查询过滤器指定要更新哪个文档的条件,更新文档提供有关对其进行什么更改的说明。

您可以可选地向 updateOne() 方法传递一个 UpdateOptions 实例,以指定该方法的行为。例如,如果您将 UpdateOptions 对象的 upsert 字段设置为 true,则在没有文档匹配查询过滤器的情况下,操作会从查询和更新文档的字段中插入一个新的文档。有关更多信息,请参阅此页底部的 UpdateOptions API 文档链接。

成功执行后,updateOne() 方法返回一个 UpdateResult 实例。您可以通过调用 getModifiedCount() 方法检索有关修改的文档数量的信息,或者通过调用 getUpsertedId() 方法获取 _id 字段的值(如果您在 UpdateOptions 实例中指定了 upsert(true))。

如果您的更新操作失败,驱动程序会引发异常。例如,如果您尝试在更新文档中设置不可变字段 _id 的值,该方法会抛出一个带有消息的 MongoWriteException

Performing an update on the path '_id' would modify the immutable field '_id'

如果您的更新文档包含违反唯一索引规则的更改,该方法会抛出一个带有类似以下错误消息的 MongoWriteException

E11000 duplicate key error collection: ...

有关特定条件下引发的异常类型的更多信息,请参阅此页底部链接的 updateOne() API 文档。

在这个示例中,我们使用一个过滤器构建器来查询名为“Cool Runnings 2”的电影集合。

接下来,我们在sample_mflix数据库的movies集合中对查询的第一个匹配项执行以下更新

  1. runtime的值设置为99

  2. 如果Sports不存在于genres数组中,则将其添加到数组中

  3. lastUpdated的值设置为当前时间

我们使用Updates构建器,一个包含静态帮助方法的工厂类,来构建更新文档。虽然您可以直接传递更新文档而不是使用构建器,但构建器提供了类型检查和简化的语法。有关更多信息,请参阅关于Updates构建器的指南

注意

此示例使用连接URI连接到MongoDB的一个实例。要了解更多关于连接到您的MongoDB实例的信息,请参阅连接指南

import com.mongodb.MongoException
import com.mongodb.client.model.Filters
import com.mongodb.client.model.UpdateOptions
import com.mongodb.client.model.Updates
import com.mongodb.kotlin.client.coroutine.MongoClient
import kotlinx.coroutines.runBlocking
import java.time.LocalDateTime
data class Movie(
val title: String,
val runtime: Int,
val genres: List<String>,
val lastUpdated: LocalDateTime
)
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")
val query = Filters.eq(Movie::title.name, "Cool Runnings 2")
val updates = Updates.combine(
Updates.set(Movie::runtime.name, 99),
Updates.addToSet(Movie::genres.name, "Sports"),
Updates.currentDate(Movie::lastUpdated.name)
)
val options = UpdateOptions().upsert(true)
try {
val result = collection.updateOne(query, updates, options)
println("Modified document count: " + result.modifiedCount)
println("Upserted id: " + result.upsertedId) // only contains a non-null value when an upsert is performed
} catch (e: MongoException) {
System.err.println("Unable to update due to an error: $e")
}
mongoClient.close()
}

运行示例后,您应该看到类似以下的输出

Modified document count: 1
Upserted id: null

或者如果示例导致了更新和插入

Modified document count: 0
Upserted id: BsonObjectId{value=...}

如果您查询更新后的文档,它应该看起来像这样

Movie(title=Cool Runnings 2, runtime=99, genres=[ ... Sports], lastUpdated= ... )

有关此页面上提到的类和方法的其他信息,请参阅以下API文档

  • UpdateOne

  • UpdateOptions

  • combine()

  • set()

  • addToSet()

  • currentDate()

  • UpdateResult

返回

更新 & 替换