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

更新多个文档

您可以使用以下方法更新多个文档:updateMany() 方法用于 MongoCollection 对象。该方法接受一个 过滤器,用于匹配要更新的文档,以及一个 更新 语句,指示驱动程序如何更改匹配的文档。updateMany() 方法更新集合中所有匹配过滤器的文档。

要使用 updateMany() 方法进行更新,您必须传递一个查询过滤器和一个更新文档。查询过滤器指定要匹配的集合中的哪些文档,更新文档提供对更改它们的指令。

您可以选择将 UpdateOptions 实例传递给 updateMany() 方法,以修改调用的行为。例如,如果您将 UpdateOptions 对象的 upsert 字段设置为 true,并且没有文档匹配指定的查询过滤器,则该操作将插入一个新文档,该文档由查询和更新文档的字段组成。

成功执行后,updateMany() 方法返回一个 UpdateResult 实例。您可以通过调用 getModifiedCount() 方法来检索有关修改的文档数量的信息。如果您在 UpdateOptions 对象中指定了 upsert(true),并且操作导致插入,您可以通过在 UpdateResult 实例上调用 getUpsertedId() 方法来检索新文档的 _id 字段。

如果您的更新操作失败,驱动程序会引发异常,并且不会更新匹配过滤器的任何文档。例如,如果您尝试在更新文档中设置不可变字段 _id 的值,则 updateMany() 方法不会更新任何文档,并抛出一个包含消息的 MongoWriteException

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

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

E11000 duplicate key error collection: ...

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

在此示例中,我们使用 Filter 构建器来过滤我们的查询,以查找流派为 "Frequently Discussed" 的电影。

接下来,我们更新 sample_mflix 数据库中的 movies 集合中与我们的查询匹配的文档。我们对匹配的文档执行以下更新

  • 如果 "Frequently Discussed" 不已存在于 genres 数组中,则将其添加到数组中

  • lastUpdated 的值设置为当前时间。

我们使用 Updates 构造函数,这是一个包含静态辅助方法的工厂类,用于构建更新文档。虽然您可以用更新文档代替构造函数,但构造函数提供了类型检查和简化语法。请阅读我们的构建器部分关于更新文档的指南以获取更多信息。

注意

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

import com.mongodb.MongoException
import com.mongodb.client.model.Filters
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 num_mflix_comments: 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.gt(Movie::num_mflix_comments.name, 50)
val updates = Updates.combine(
Updates.addToSet(Movie::genres.name, "Frequently Discussed"),
Updates.currentDate(Movie::lastUpdated.name)
)
try {
val result = collection.updateMany(query, updates)
println("Modified document count: " + result.modifiedCount)
} catch (e: MongoException) {
System.err.println("Unable to update due to an error: $e")
}
mongoClient.close()
}
Modified document count: 53

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

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

Movie(num_mflix_comments=100, genres=[ ... Frequently Discussed], lastUpdated= ... )

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

  • UpdateMany

  • UpdateOptions

  • combine()

  • addToSet()

  • currentDate()

  • UpdateResult

返回

更新单个文档