删除
定义
delete
delete
命令从集合中删文档。一个delete
命令可以包含多个删除规范。MongoDB 驱动程序提供的删除方法会在内部使用此命令。5.0 版本中的更改。
提示
在
mongosh
中,该命令还运行通过deleteOne()
、deleteMany()
和findOneAndDelete()
辅助方法运行。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。返回: 包含操作状态的文档。有关详细信息,请参阅输出。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
db.runCommand( { delete: <collection>, deletes: [ { q : <query>, limit : <integer>, collation: <document>, hint: <document|string> }, ... ], comment: <any>, let: <document>, // Added in MongoDB 5.0 ordered: <boolean>, writeConcern: { <write concern> }, maxTimeMS: <integer> } )
命令字段
该命令接受以下字段:
字段 | 类型 | 说明 | |||||
---|---|---|---|---|---|---|---|
字符串 | 目标集合的名称。 | ||||||
阵列 | 对指定集合执行的一个或多个删除语句的数组。 | ||||||
comment | any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 | |||||
文档 | 可选。 指定包含变量列表的文档。这样可以将变量与查询文本分开,从而提高命令的可读性。 文档语法为:
变量设置为表达式返回的值,并且之后不能再进行更改。 要访问命令中的变量值,请使用双美元符号前缀 ( 要使用变量筛选结果,您必须在 有关使用 版本 5.0 中的新增功能。 | ||||||
布尔 | 可选。如果为 | ||||||
文档 | |||||||
maxTimeMS | non-negative integer | 可选。 指定时间限制(以毫秒为单位)。如果您未指定 MongoDB 使用与 |
deletes
数组中的每个元素都包含以下字段:
字段 | 类型 | 说明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
文档 | 匹配要删除的文档的查询。 | |||||||||||
整型 | 要删除的匹配文档的数量。指定 | |||||||||||
文档 | 可选。 指定用于操作的排序规则。 排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。 排序规则选项的语法如下:
指定排序规则时, 如果未指定排序规则,但集合具有默认排序规则(请参阅 如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。 | |||||||||||
文档或字符串 |
行为
分片集合
要对指定 limit: 1
选项的分片集合使用 delete
操作:
如果您仅针对一个分片,则可以在查询规范中使用部分分片键,或者
您可以在查询规范中提供分片键或
_id
字段。
限制
deletes
数组中的所有查询的总大小(即 q
字段值)必须小于或等于最大 BSON 文档大小。
deletes
数组中删除文档的总数必须小于或等于最大批量大小。
事务
可以在分布式事务中使用 delete。
如果是在事务中运行,则请勿显式设置此操作的写关注。要将写关注与事务一起使用,请参阅事务和写关注。
重要
在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。
有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项。
示例
限制已删除文档的数量
以下示例通过指定 1
的 limit
从orders
集合中删除 status
等于 D
的一个文档:
db.runCommand( { delete: "orders", deletes: [ { q: { status: "D" }, limit: 1 } ] } )
返回的文档显示该命令删除了 1
文档。有关详细信息,请参阅输出。
{ "ok" : 1, "n" : 1 }
删除符合条件的所有文档
以下示例通过指定 0
的 limit
从orders
集合中删除 status
等于 D
的所有文档:
db.runCommand( { delete: "orders", deletes: [ { q: { status: "D" }, limit: 0 } ], writeConcern: { w: "majority", wtimeout: 5000 } } )
返回的文档显示该命令找到并删除了 13
个文档。有关详细信息,请参阅输出。
{ "ok" : 1, "n" : 13 }
从集合中删除所有文档
注意
如果要删除大型集合中的所有文档,则删除该集合并重新创建可能速度更快。 在删除集合之前,请记下集合上的所有索引。 您必须重新创建原始集合中存在的任何 索引 。 如果对原始集合进行分片的,则还分片对重新创建的集合进行分片。
有关删除集合的更多信息,请参阅 db.collection.drop()
。
指定空查询条件并 将 limit
设置为 0
,以删除 orders
集合中的所有文档:
db.runCommand( { delete: "orders", deletes: [ { q: { }, limit: 0 } ], writeConcern: { w: "majority", wtimeout: 5000 } } )
返回的文档显示该命令总共找到并删除了 35
个文档。有关详细信息,请参阅输出。
{ "ok" : 1, "n" : 35 }
批量删除
以下示例对 orders
集合执行多个删除操作:
db.runCommand( { delete: "orders", deletes: [ { q: { status: "D" }, limit: 0 }, { q: { cust_num: 99999, item: "abc123", status: "A" }, limit: 1 } ], ordered: false, writeConcern: { w: 1 } } )
返回的文档显示该命令总共为两个删除语句找到并删除了 21
个文档。有关详细信息,请参阅输出。
{ "ok" : 1, "n" : 21 }
指定排序规则。
排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。
集合 myColl
包含以下文档:
{ _id: 1, category: "café", status: "A" } { _id: 2, category: "cafe", status: "a" } { _id: 3, category: "cafE", status: "a" }
以下操作包括排序规则选项:
db.runCommand({ delete: "myColl", deletes: [ { q: { category: "cafe", status: "a" }, limit: 0, collation: { locale: "fr", strength: 1 } } ] })
hint
为删除操作指定
在 mongosh
中,创建一个 members
集合,其中包含以下文档:
db.members.insertMany([ { "_id" : 1, "member" : "abc123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null }, { "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }, { "_id" : 3, "member" : "lmn123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null }, { "_id" : 4, "member" : "pqr123", "status" : "D", "points" : 20, "misc1" : "Deactivated", "misc2" : null }, { "_id" : 5, "member" : "ijk123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null }, { "_id" : 6, "member" : "cde123", "status" : "A", "points" : 86, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" } ])
在集合上创建以下索引:
db.members.createIndex( { status: 1 } ) db.members.createIndex( { points: 1 } )
以下删除操作明确提示使用索引 { status: 1 }
:
db.runCommand({ delete: "members", deletes: [ { q: { "points": { $lte: 20 }, "status": "P" }, limit: 0, hint: { status: 1 } } ] })
注意
如果指定不存在的索引,则操作出错。
要查看使用的索引,请对操作运行 explain
:
db.runCommand( { explain: { delete: "members", deletes: [ { q: { "points": { $lte: 20 }, "status": "P" }, limit: 0, hint: { status: 1 } } ] }, verbosity: "queryPlanner" } )
使用以下项中的变量: let
版本 5.0 中的新增功能。
要定义可在命令中其他位置访问的变量,请使用 let 选项。
注意
要使用变量筛选结果,您必须在 $expr
操作符中访问该变量。
创建集合 cakeFlavors
:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
以下示例在 let
中定义了一个 targetFlavor
变量,并使用该变量删除草莓蛋糕口味:
db.runCommand( { delete: db.cakeFlavors.getName(), deletes: [ { q: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, limit: 1 } ], let : { targetFlavor: "strawberry" } } )
输出
返回的文档包含以下字段的子集:
delete.writeErrors
包含在删除操作过程中遇到的任何错误的相关信息的文档数组。
writeErrors
数组包含每个出错的删除语句的错误文档。每个错误文档包含以下信息:
delete.writeConcernError
文档描述与写关注相关的错误,并包含以下字段:
delete.writeConcernError.errInfo.writeConcern
用于相应操作的写关注对象。有关写关注对象字段的信息,请参阅写关注规范。
写关注对象还可能包含以下字段,指示写关注的来源:
delete.writeConcernError.errInfo.writeConcern.provenance
一个表示写关注来源(称为写关注
provenance
)的字符串值。下表显示该字段的可能值及其有效位数:来源说明clientSupplied
应用程序中指定了写关注。customDefault
写入关注源自自定义的默认值。请参阅setDefaultRWConcern
。getLastErrorDefaults
写关注源自副本集的settings.getLastErrorDefaults
字段。implicitDefault
在没有所有其他写入关注规范的情况下,写入关注源自服务器。
以下是成功执行 delete
命令返回的示例文档:
{ ok: 1, n: 1 }
以下是为 delete
命令返回的示例文档,该命令由于在 hint
字段中指定了不存在的索引而遇到错误:
{ n: 0, writeErrors: [ { index: 0, code: 2, errmsg: 'error processing query: ns=test.products: hat $eq "bowler"\n' + 'Sort: {}\n' + 'Proj: {}\n' + ' planner returned error :: caused by :: hint provided does not correspond to an existing index' } ], ok: 1 }