Overview
在本指南中,您可以学习如何使用Scala驱动程序通过执行删除操作从MongoDB集合中删除文档。
删除操作可从 MongoDB 集合中删除一个或多个文档。 您可以使用deleteOne()或deleteMany()方法执行删除操作。
样本数据
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 中执行删除操作:
deleteOne(),这会删除与 Atlas Search条件匹配的 第一个文档deleteMany(),这会删除与 Atlas Search条件匹配的 所有文档
每个删除方法都需要一个查询过滤文档,它指定了搜索条件,以确定选择要删除的文档。 如需学习;了解有关查询筛选器的更多信息,请参阅“指定查询”指南。
删除一个文档
以下示例使用deleteOne()方法删除name字段值为"Happy Garden"的文档:
val filter = equal("name", "Happy Garden") val observable: Observable[DeleteResult] = collection.deleteOne(filter) observable.subscribe(new Observer[DeleteResult] { override def onNext(result: DeleteResult): Unit = println(s"Deleted document count: ${result.getDeletedCount}") override def onError(e: Throwable): Unit = println(s"Error: $e") override def onComplete(): Unit = println("Completed") })
Deleted document count: 1 Completed
删除多个文档
以下示例使用deleteMany()方法删除borough字段值为"Brooklyn"且name字段值为"Starbucks"的所有文档:
val filter = and( equal("borough", "Brooklyn"), equal("name", "Starbucks") ) val observable: Observable[DeleteResult] = collection.deleteMany(filter) observable.subscribe(new Observer[DeleteResult] { override def onNext(result: DeleteResult): Unit = println(s"Deleted document count: ${result.getDeletedCount}") override def onError(e: Throwable): Unit = println(s"Error: $e") override def onComplete(): Unit = println("Completed") })
Deleted document count: 3 Completed
自定义删除操作
deleteOne() 和 deleteMany() 方法可以选择接受 DeleteOptions 参数,该参数表示可用于配置删除操作的选项。如果不指定任何选项,驱动程序将使用默认设置执行删除操作。
下表描述了可用于配置DeleteOptions实例的 setter 方法:
方法 | 说明 |
|---|---|
| 指定对结果进行排序时要使用的语言排序规则类型。 有关更多信息,请参阅 MongoDB Server 手册中的排序规则。 |
| |
| |
| 提供参数名称和值的映射,以便为操作设立顶级变量。值必须是常量或不引用文档字段的闭合表达式。有关更多信息,请参阅MongoDB Server手册的 参考页面中的 let 选项。 |
|
修改删除示例
以下代码创建选项并使用comment()方法为删除操作添加注释。 然后,该示例使用 deleteMany() 方法删除restaurants集合中 name字段的值包含string "Red" 的所有文档。
val filter = regex("name", "Red") val opts = DeleteOptions().comment("sample comment") val observable = collection.deleteMany(filter, opts) observable.subscribe(new Observer[DeleteResult] { override def onNext(result: DeleteResult): Unit = println(s"Deleted document count: ${result.getDeletedCount}") override def onError(e: Throwable): Unit = println(s"Error: $e") override def onComplete(): Unit = println("Completed") })
Deleted document count: 124 Completed
提示
如果在上示例中使用 deleteOne() 方法而不是 deleteMany() 方法,则驱动程序仅删除与查询筛选条件匹配的第一个文档。
返回值
deleteOne()和deleteMany()方法各返回一个DeleteResult实例。 您可以从DeleteResult实例访问权限以下信息:
deletedCount,表示已删除的文档数wasAcknowledged(),如果服务器确认结果,则返回true
如果查询筛选条件未匹配任何文档,则驱动程序不会删除任何文档,并且 deletedCount 的值为 0。
注意
如果 wasAcknowledged() 方法返回 false,则尝试访问权限deletedCount属性会导致 InvalidOperation 异常。如果服务器未确认写入操作,则驱动程序无法确定这些值。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: