更新多个文档
您可以使用以下方法更新多个文档: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 文档