删除
定义
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> } )
命令字段
命令包含以下字段
字段 | 类型 | 描述 | |||||
---|---|---|---|---|---|---|---|
string | 目标集合的名称。 | ||||||
array | 要执行的一个或多个删除语句的数组。 | ||||||
comment | any | 可选。用户提供的注释,附加到此命令。一旦设置,此注释将出现在以下位置
注释可以是任何有效的 BSON 类型(字符串、整数、对象、数组等)。 | |||||
document | 可选。 指定一个包含变量列表的文档。这允许您通过将变量与查询文本分离来提高命令的可读性。 文档语法是
变量被设置为表达式返回的值,之后无法更改。 要在命令中访问变量的值,请使用双美元符号前缀( 要使用变量进行结果过滤,必须在 有关使用 新版本5.0. | ||||||
布尔型 | 可选。如果设置为 | ||||||
document | |||||||
maxTimeMS | 非负整数 | 可选。 指定一个以毫秒为单位的时间限制。如果不指定 MongoDB 使用与 |
deletes
数组的每个元素包含以下字段
字段 | 类型 | 描述 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
document | 匹配要删除文档的查询。 | |||||||||||
整数 | 要删除的匹配文档的数量。指定 | |||||||||||
document | 可选。 指定操作所使用的排序方式。 排序方式允许用户指定字符串比较的语言特定规则,例如字母大小写和重音符号的规则。 排序选项的语法如下
指定排序方式时,必须指定 如果未指定排序方式,但集合有一个默认排序方式(参见 如果未为集合或操作指定排序方式,MongoDB 将使用之前版本中用于字符串比较的简单二进制比较。 您不能为操作指定多个排序方式。例如,您不能按字段指定不同的排序方式,或者在进行带有排序的查找时,您不能为一个查找和一个排序使用不同的排序方式。 | |||||||||||
文档或字符串 |
行为
分片集合
要为指定 limit: 1
选项的分片集合执行 delete
操作
如果您只针对一个分片,您可以在查询规范中使用部分分片键,或者
您可以在查询指定中提供分片键或
_id
字段。
限制
删除数组中所有查询的总大小(即q
字段值)必须小于或等于最大BSON文档大小。
删除数组中删除文档的总数必须小于或等于最大批量大小。
事务
删除可以在分布式事务中使用。
如果在一个事务中运行,不要显式设置操作写关注。有关使用事务与写关注的说明,请参阅 事务和写关注。
重要
在大多数情况下,分布式事务相对于单文档写入会带来更高的性能成本,分布式事务的可用性不应替代有效的架构设计。对于许多场景,非规范化数据模型(嵌入文档和数组)将仍然是您的数据和用例的最佳选择。也就是说,在许多场景中,适当地建模您的数据将最大限度地减少分布式事务的需求。
有关事务使用的其他考虑事项(例如运行时限制和oplog大小限制),请参阅生产注意事项。
示例
限制删除的文档数量
以下示例通过指定limit
为1
从orders
集合中删除状态等于D
的单个文档。
db.runCommand( { delete: "orders", deletes: [ { q: { status: "D" }, limit: 1 } ] } )
返回的文档显示命令已删除1
个文档。请参阅输出以获取详细信息。
{ "ok" : 1, "n" : 1 }
删除匹配条件的所有文档
以下示例通过指定limit
为0
从orders
集合中删除所有状态等于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
描述与写入关注点相关的错误文档。
包含以下字段的
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 }