对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

db. 集合.deleteMany()(mongosh方法)

带驱动程序的 MongoDB

本页面文档 mongosh 方法。要查看 MongoDB 驱动程序中的等效方法,请参阅您的编程语言的相应页面:
db.collection.deleteMany()

从集合中删除与 filter 匹配的所有文档。

返回:

文档包含以下内容:

  • 如果操作使用写关注来运行,则布尔值 acknowledged 为 true;如果已禁用写关注,则为 false

  • deletedCount 包含已删除文档的数量

注意

如果要删除大型集合中的所有文档,则删除该集合并重新创建可能速度更快。在删除集合之前,请记下集合上的所有索引。您必须重新创建原始集合中存在的任何索引。如果原始集合是分片的,则对重新创建的集合也要分片。

有关删除集合的更多信息,请参阅 db.collection.drop()。

此方法可用于以下环境中托管的部署:

  • MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud

注意

This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.

db.collection.deleteMany() 通过以下语法实现:

db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>,
hint: <document>|<string>,
maxTimeMS: <int>,
let: <document>
}
)
Parameter
类型
说明

文档

使用查询运算符指定删除条件。

要删除集合中的所有文档,请传入空文档 ({ })。

文档

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

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

文档

可选。

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

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

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

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

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

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

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

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

文档

Optional. A document or string that specifies the index to use to support the query predicate.

该选项可以采用索引规范文档或索引名称字符串。

如果指定不存在的索引,则操作出错。

For an example, see Specify hint for Delete Operations.

整型

可选。指定删除操作在超时之前运行的时间限制(以毫秒为单位)。

文档

可选。

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

文档语法为:

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

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

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

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

有关使用 let 和变量的完整示例,请参阅使用 let 变量进行更新。

  • 如果deleteMany()在事务之外运行,针对多个分片的操作会将该操作广播到集群中的所有分片。

  • 如果 deleteMany() 在ACID 事务中运行,则针对多个分片的操作仅针对相关分片。

警告

由于存在并发数据块迁移,deleteMany()运行可能不会删除与指定过滤匹配的所有文档。为确保删除所有匹配的文档,请执行以下操作之一:

  • 以迭代方式运行 deleteMany() 方法,直到使用相同过滤的相应查找查询不返回任何文档。

  • 在ACID 事务中运行 deleteMany()。

  • 安排负载均衡窗口,使数据块迁移仅在特定时间发生,并在指定窗口之外运行任何 deleteMany() 操作。

要删除单个文档,请使用 db.collection.deleteOne()。

或者,使用属于唯一索引一部分的字段,例如 _id。

deleteMany() 可用于分布式事务。

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

重要

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

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

deleteMany() 一次删除一个文档。如果主节点 (primary node in the replica set) 在 deleteMany() 操作期间失败,则尚未从从节点(secondary node from replica set)删除的文档不会从集合中删除。

如果 db.collection.deleteMany() 操作成功删除了一个或多个文档,则该操作会在 oplog(操作日志)上为每个已删除的文档添加一个条目。如果操作失败或者没有找到任何要删除的文档,则操作不会在 oplog 上添加条目。

本页上的示例使用来自 sample_mflix 数据集的数据。有关如何将此数据集加载到您的自管理 MongoDB 部署中的详细信息,请参阅 加载示例数据集。如果您对示例数据库进行了任何修改,您可能需要删除并重新创建数据库,才能运行此页面上的示例。

以下操作会删除 year 早于 1910 的所有 document:

db.movies.deleteMany( { "year": { $lt: 1910 } } )
{ acknowledged: true, deletedCount: 4 }

同样,此操作会删除 rated 等于 "G" 且 year 早于 1950 的所有 document:

db.movies.deleteMany( { "rated": "G", "year": { $lt: 1950 } } )
{ acknowledged: true, deletedCount: 9 }

以下操作删除 year 早于 cutoffYear 变量的所有 document。该示例还设置了 3 秒的时间限制:

db.movies.deleteMany(
{ $expr: { $lt: [ "$year", "$$cutoffYear" ] } },
{
let: { cutoffYear: 1910 },
maxTimeMS: 3000
}
)
{ acknowledged: true, deletedCount: 4 }

给定一个三成员副本集,以下操作指定 majority 的 w 和 100 的 wtimeout:

db.movies.deleteMany(
{ "rated": "G", "year": { $lt: 1950 } },
{ writeConcern: { w: "majority", wtimeout: 100 } }
)
{ acknowledged: true, deletedCount: 9 }

如果确认时间超过 wtimeout 限制, MongoDB将引发写关注(write concern)错误。

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

以下操作使用具有英语区域设置和排序规则选项和 strength: 2。过滤器rated: "g" 会匹配集合中存储的具有 rated: "G" 的document:

db.movies.deleteMany(
{ rated: "g", year: { $lt: 1950 } },
{ collation: { locale: "en", strength: 2 } }
)
{ acknowledged: true, deletedCount: 9 }

在 rated 和 metacritic 字段上创建索引:

db.movies.createIndex( { rated: 1 } )
db.movies.createIndex( { metacritic: 1 } )

以下删除操作明确提示使用索引 { rated: 1 }:

db.movies.deleteMany(
{ "metacritic": { $lte: 15 }, "rated": "PG" },
{ hint: { rated: 1 } }
)
{ acknowledged: true, deletedCount: 7 }

注意

如果指定不存在的索引,则操作出错。

要查看使用的索引,可以使用 $indexStats 管道:

db.movies.aggregate( [ { $indexStats: { } }, { $sort: { name: 1 } } ] )

$indexStats 输出中的 accesses.ops 字段表示使用该索引的操作次数。

给本页内容打分