Docs 菜单
Docs 主页
/ /

db.集合。 删除()(mongosh方法)

重要

已弃用的 mongosh 方法

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

db.collection.remove()

从集合中删除文档。

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

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
}
)

db.collection.remove() 使用以下参数:

Parameter
类型
说明

query

文档

使用查询操作符指定删除条件。要删除集合中的所有文档,请传递空文档 ({})。

justOne

布尔

可选。要将删除限制为仅删除一个文档,请设置为 true。忽略,使用默认值 false 并删除所有符合删除条件的文档。

writeConcern

文档

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

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

collation

文档

可选。

可选。指定用于操作的排序规则

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

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

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

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

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

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

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

文档

可选。

指定包含变量列表的文档。这样可以将变量与查询文本分开,从而提高命令的可读性。

文档语法为:

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

变量设置为表达式返回的值,并且之后不能再进行更改。

要访问命令中的变量值,请使用双美元符号前缀 ($$) 以及 $$<variable_name> 形式的变量名称。例如:$$targetTotal

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

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

版本 5.0 中的新增功能

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

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

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

不能在 时间序列集合上使用 remove()

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

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

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

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 } }
)

要删除第一个符合删除标准的文档,请调用带 query 标准的 remove() 方法,并将 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() 遇到写关注(write concern)错误,结果包括 WriteResult.writeConcernError 字段:

WriteResult({
"nRemoved" : 7,
"writeConcernError" : {
"code" : 64,
"codeName" : "WriteConcernTimeout",
"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

在此页面上