更新多个文档
您可以对 MongoCollection
对象使用 updateMany()
方法更新多份文档。该方法接受与待更新文档匹配的筛选器,以及指示驱动程序如何更改匹配文档的更新语句。updateMany()
方法更新集合中与筛选器匹配的所有文档。
要使用 updateMany()
方法执行更新,必须传递查询筛选器和更新文档。查询筛选器指定要匹配集合中的哪些文档,更新文档说明对它们进行哪些更改。
您可以选择向 updateMany()
方法传递 UpdateOptions
的实例,以修改调用行为。例如,如果将 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
构建器来筛选“经常讨论”类型电影的查询。
接下来,我们更新sample_mflix
数据库的movies
collection中与查询相匹配的文档。我们对匹配文档执行以下更新:
仅当
genres
数组中不存在Frequently Discussed
时,才可将其添加到该数组中将
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 文档: