Overview
在本指南中,您可以学习如何使用 Scala 驱动程序通过 updateOne() 和 updateMany() 方法更新 MongoDB 集合中的文档。
样本数据
restaurantssample_restaurants本指南中的示例使用Atlas示例数据集的 数据库中的 集合。要从Scala应用程序访问权限此集合,请创建一个连接到Atlas 集群的MongoClient,并将以下值分配给 database 和 collection 变量:
val database: MongoDatabase = mongoClient.getDatabase("sample_restaurants") val collection: MongoCollection[Document] = database.getCollection("restaurants")
要学习如何创建免费的MongoDB Atlas 集群并加载示例数据集,请参阅MongoDB 入门指南。
更新操作
您可以使用以下方法更新MongoDB中的文档:
updateOne(),更新匹配搜索条件的第一个文档updateMany(),更新与搜索条件匹配的所有文档
每种更新方法都需要以下参数:
查询过滤,用于匹配要更新的文档。如需学习;了解有关查询筛选器的更多信息,请参阅“指定查询”指南。
更新一个文档示例
以下示例使用 updateOne() 方法将文档的 name字段值从 "Happy Garden"更新为 "Mountain House"。 更新文档使用 set() 方法更新name字段值:
val filter = equal("name", "Happy Garden") val update = set("name", "Mountain House") val observable: Observable[UpdateResult] = collection.updateOne(filter, update) observable.subscribe(new Observer[UpdateResult] { override def onNext(result: UpdateResult): Unit = println(s"Updated document count: ${result.getModifiedCount}") override def onError(e: Throwable): Unit = println(s"Failed: ${e.getMessage}") override def onComplete(): Unit = println("Completed") })
Updated document count: 1 Completed
更新多个文档示例
以下示例使用 updateMany() 方法更新name字段值为 "Starbucks" 的所有文档。 更新文档使用 rename() 方法将 address字段的名称更改为 location:
val filter = equal("name", "Starbucks") val update = rename("address", "location") val observable: Observable[UpdateResult] = collection.updateMany(filter, update) observable.subscribe(new Observer[UpdateResult] { override def onNext(result: UpdateResult): Unit = println(s"Updated document count: ${result.getModifiedCount}") override def onError(e: Throwable): Unit = println(s"Failed: ${e.getMessage}") override def onComplete(): Unit = println("Completed") })
Updated document count: 11 Completed
自定义更新操作
updateOne() 和 updateMany() 方法可以选择接受一个参数,该参数设置配置更新操作的选项。如果不指定任何选项,驱动程序将使用默认设置执行更新操作。
下表描述了可用于配置UpdateOptions实例的 setter 方法:
方法 | 说明 |
|---|---|
| |
| 设置要应用操作的排序条件。 如果多个文档与您传递给 |
| |
| 指定对结果进行排序时要使用的语言排序规则类型。 有关更多信息,请参阅 MongoDB Server 手册中的排序规则。 |
| 提供您指定的筛选器列表,用于选择更新要应用于的大量元素。 |
| |
| |
|
修改更新示例
此示例创建选项并将其传递给 updateOne() 方法。 该示例使用 equal() 辅助方法来匹配 name字段值为 "Sunrise Pizzeria" 的文档。 然后,它使用 set() 方法将第一个匹配文档中的 borough字段值设立为 "Queens",并将 cuisine字段值设置为 "Italian"。 该代码使用 combine() 方法在一个更新文档中指定多个更新。
由于 upsert 选项在 UpdateOptions实例中设立为 true,因此,如果查询筛选条件与任何现有文档都不匹配,则驱动程序会插入包含过滤器和更新文档中指定的字段和值的新文档。
val filter = equal("name", "Sunrise Pizzeria") val opts = UpdateOptions().upsert(true) val update = combine( set("borough", "Queens"), set("cuisine", "Italian") ) val observable: Observable[UpdateResult] = collection.updateOne(filter, update, opts) observable.subscribe(new Observer[UpdateResult] { override def onNext(result: UpdateResult): Unit = println(s"Updated document count: ${result.getModifiedCount}") override def onError(e: Throwable): Unit = println(s"Failed: ${e.getMessage}") override def onComplete(): Unit = println("Completed") })
Updated document count: 1 Completed
返回值
updateOne()和updateMany()方法各自返回一个UpdateResult对象。 您可以使用以下方法访问权限UpdateResult实例中的信息:
方法 | 说明 |
|---|---|
| 无论执行了多少次更新,都返回与查询过滤匹配的文档数。 |
| 返回更新操作修改的文档数。 如果更新后的文档与原始文档相同,则不计入此计数。 |
| 如果服务器确认结果,则返回 |
| 如果驱动程序执行了更新或插入,则返回在数据库中更新或插入的文档的 |
注意
如果 wasAcknowledged() 方法返回 false,则尝试从 UpdateResult实例访问权限其他信息会导致 InvalidOperation 异常。如果服务器未确认写入操作,则驱动程序无法确定这些值。
更多信息
要查看演示如何使用Scala驱动程序更新文档的可运行代码示例,请参阅将数据写入MongoDB。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: