“文档” 菜单
文档首页
/
MongoDB Manual
/ / /

db.collection.remove()

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 行为
  • 举例
  • WriteResult

重要

已弃用的 mongosh 方法

此方法在 mongosh 中已弃用。有关替代方法,请参阅与旧版 mongo Shell 的兼容性更改

db.collection.remove()

从集合中删除文档。

返回:一个包含该操作状态的 WriteResult 对象。

可以使用 db.collection.remove() 查找托管在以下环境中的部署:

  • MongoDB Atlas :用于在云中部署 MongoDB 的完全托管服务

  • MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本

  • MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本

db.collection.remove() 方法有两种语法。remove() 方法可以采用查询文档和可选的 justOne 布尔值:

db.collection.remove(
<query>,
<justOne>
)

该方法也可以采用查询文档和可选的删除选项文档:

5.0 版本中的更改

db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>,
collation: <document>,
let: <document> // Added in MongoDB 5.0
}
)

remove() 方法使用以下参数:

参数
类型
说明
query
文档
使用查询运算符指定删除条件。要删除集合中的所有文档,请传递空文档 ({})。
justOne
布尔
可选。要将删除限制为仅删除一个文档,请设置为 true。忽略,使用默认值 false 并删除所有符合删除条件的文档。
writeConcern
文档

可选。表达写关注的文档。省略以使用默认的写关注。请参阅写关注

如果是在事务中运行,则请勿显式设置此操作的写关注。要将写关注与事务一起使用,请参阅事务和写关注。

collation
文档

可选。

指定用于操作的排序规则

排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。

排序规则选项的语法如下:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

指定排序规则时,locale 字段为必填字段;所有其他排序规则字段均为可选字段。有关字段的说明,请参阅排序规则文档

如果未指定排序规则,但集合具有默认排序规则(请参阅 db.createCollection()),则操作将使用为集合指定的排序规则。

如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。

您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。

文档

可选。.. include:: /includes/let-variables-syntax.rst .. include:: /includes/let-variables-syntax-note.rst

有关使用 let 和变量的完整示例,请参阅let 中使用变量

版本 5.0 中的新增功能

remove() 方法使用 delete 命令,该命令使用默认的写关注。要指定不同的写关注,请将写关注包含在 options 参数中。

默认情况下,remove() 会删除所有匹配 query 表达式的文档。指定 justOne 选项以将该操作限制为删除单个文档。要删除按指定顺序排列的单个文档,请使用 findAndModify() 方法。

删除多个文档时,删除操作可能会与集合的其他读取和/或写入操作交错。

不能对时间序列集合使用 remove() 方法。

要对指定 justOne: true 选项的分片集合使用 remove() 操作:

  • 如果您仅针对一个分片,则可以在查询规范中使用部分分片键,或者

  • 您可以在查询规范中提供分片键_id 字段。

db.collection.remove() 可以在分布式事务中使用。

如果是在事务中运行,则请勿显式设置此操作的写关注。要将写关注与事务一起使用,请参阅事务和写关注。

重要

在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。

有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项

以下是 remove() 方法的示例。

要删除集合中的所有文档,请调用带有空文档 {}remove 方法。以下操作会删除 bios 集合中的所有文档:

db.bios.remove( { } )

此操作不等同于 drop() 方法。

要从集合中删除所有文档,更高效的做法是使用 drop() 方法删除整个集合(包括索引),然后重新创建该集合并重建索引。

如要删除匹配删除条件的文档,请调用带有 <query> 参数的 remove() 方法:

以下操作会删除集合 productsqty 大于 20 的所有文档:

db.products.remove( { qty: { $gt: 20 } } )

以下对副本集的操作将从集合 products 中删除 qty 大于 20 的所有文档并指定写关注 w: 2,其中 wtimeout 为 5000 毫秒。此操作要么在写入传播到主节点和一个从节点后返回,要么在 5 秒后超时。

db.products.remove(
{ qty: { $gt: 20 } },
{ writeConcern: { w: "majority", wtimeout: 5000 } }
)

要删除第一个符合删除条件的文档,请调用 remove 方法,并将 query 条件和 justOne 参数设置为 true1

以下操作从集合 products 中删除 qty 大于 20 的第一份文档:

db.products.remove( { qty: { $gt: 20 } }, true )

排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。

集合 myColl 包含以下文档:

{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

以下操作包括排序规则选项:

db.myColl.remove(
{ category: "cafe", status: "A" },
{ collation: { locale: "fr", strength: 1 } }
)

版本 5.0 中的新增功能

要定义可在命令中其他位置访问的变量,请使用 let 选项。

注意

要使用变量筛选结果,您必须在 $expr 操作符中访问该变量。

创建集合 cakeFlavors

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

以下示例在 let 中定义了一个 targetFlavor 变量,并使用该变量删除草莓蛋糕口味:

db.cakeFlavors.remove(
{ $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
{ let : { targetFlavor: "strawberry" } }
)

remove() 会返回一个包含操作状态的 WriteResult() 对象。成功后,WriteResult() 对象将包含被删除文档数量的信息。

WriteResult({ "nRemoved" : 4 })

提示

另请参阅:

如果 remove() 方法遇到写关注错误,结果将包括 WriteResult.writeConcernError 字段:

WriteResult({
"nRemoved" : 7,
"writeConcernError" : {
"code" : 64,
"codeName" : "WriteConcernFailed",
"errmsg" : "waiting for replication timed out",
"errInfo" : {
"wtimeout" : true,
"writeConcern" : {
"w" : "majority",
"wtimeout" : 1,
"provenance" : "getLastErrorDefaults"
}
}
}
})

如果 remove() 方法遇到非写关注错误,结果将包括 WriteResult.writeError 字段:

WriteResult({
"nRemoved" : 0,
"writeError" : {
"code" : 2,
"errmsg" : "unknown top level operator: $invalidFieldName"
}
})

提示

← db.collection.reIndex()