文档菜单
文档首页
/
MongoDB 手册
/ / /

删除

本页

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 行为
  • 示例
  • 输出
delete

delete命令从集合中删除文档。单个delete命令可以包含多个删除规范。MongoDB驱动程序提供的删除方法内部使用此命令。

已更改版本5.0.

提示

mongosh中,此命令也可以通过deleteOne()deleteMany()findOneAndDelete()辅助方法来运行.

辅助方法对mongosh用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。

返回:包含操作状态的文档。有关详细信息,请参阅输出

此命令在以下环境中托管的部署中可用

  • MongoDB Atlas:MongoDB在云中的全托管服务

注意

此命令在所有MongoDB Atlas集群中受支持。有关Atlas对所有命令的支持信息,请参阅不受支持的命令。

该命令具有以下语法

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

可选。

指定一个包含变量列表的文档。这允许您通过将变量与查询文本分离来提高命令的可读性。

文档语法是

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

变量被设置为表达式返回的值,之后无法更改。

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

要使用变量进行结果过滤,必须在 $expr 操作符内部访问变量。

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

版本5.0.

布尔型

可选。如果设置为 true,则在删除语句失败时,将返回而不执行剩余的删除语句。如果设置为 false,则在删除语句失败时,将继续执行剩余的删除语句(如果有的话)。默认值为 true

document

可选。表示 delete 命令的 写关注 的文档。省略则使用默认写关注。

如果在一个事务中运行,不要显式设置操作写关注。有关使用事务与写关注的说明,请参阅 事务和写关注。

maxTimeMS
非负整数

可选。

指定一个以毫秒为单位的时间限制。如果不指定 maxTimeMS 的值,则操作不会超时。显式指定 0 的值将指定默认的无限制行为。

MongoDB 使用与 db.killOp() 相同的机制终止超出其分配时间限制的操作。MongoDB 只在操作的一个指定 中断点 终止操作。

deletes 数组的每个元素包含以下字段

字段
类型
描述
document

匹配要删除文档的查询。

整数

要删除的匹配文档的数量。指定 0 以删除所有匹配的文档,或指定 1 以删除单个文档。

document

可选。

指定操作所使用的排序方式。

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

排序选项的语法如下

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

指定排序方式时,必须指定 locale 字段;所有其他排序字段都是可选的。有关字段的描述,请参阅排序文档。

如果未指定排序方式,但集合有一个默认排序方式(参见db.createCollection()),则操作使用为集合指定的排序方式。

如果未为集合或操作指定排序方式,MongoDB 将使用之前版本中用于字符串比较的简单二进制比较。

您不能为操作指定多个排序方式。例如,您不能按字段指定不同的排序方式,或者在进行带有排序的查找时,您不能为一个查找和一个排序使用不同的排序方式。

文档或字符串

可选。一个文档或字符串,指定用于支持查询谓词。的索引。

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

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

有关示例,请参阅为删除操作指定 hint

要为指定 limit: 1 选项的分片集合执行 delete 操作

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

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

删除数组中所有查询的总大小(即q字段值)必须小于或等于最大BSON文档大小。

删除数组中删除文档的总数必须小于或等于最大批量大小。

删除可以在分布式事务中使用。

如果在一个事务中运行,不要显式设置操作写关注。有关使用事务与写关注的说明,请参阅 事务和写关注。

重要

在大多数情况下,分布式事务相对于单文档写入会带来更高的性能成本,分布式事务的可用性不应替代有效的架构设计。对于许多场景,非规范化数据模型(嵌入文档和数组)将仍然是您的数据和用例的最佳选择。也就是说,在许多场景中,适当地建模您的数据将最大限度地减少分布式事务的需求。

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

以下示例通过指定limit1orders集合中删除状态等于D的单个文档。

db.runCommand(
{
delete: "orders",
deletes: [ { q: { status: "D" }, limit: 1 } ]
}
)

返回的文档显示命令已删除1个文档。请参阅输出以获取详细信息。

{ "ok" : 1, "n" : 1 }

注意

要为指定 limit: 1 选项的分片集合执行 delete 操作

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

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

以下示例通过指定limit0orders集合中删除所有状态等于D的文档。

db.runCommand(
{
delete: "orders",
deletes: [ { q: { status: "D" }, limit: 0 } ],
writeConcern: { w: "majority", wtimeout: 5000 }
}
)

返回的文档显示命令找到并删除了13个文档。请参阅输出以获取详细信息。

{ "ok" : 1, "n" : 13 }

注意

如果您正在删除大型集合中的所有文档,则删除集合并重新创建它可能会更快。在删除集合之前,请注意集合上的所有索引。您必须重新创建原始集合中存在的任何索引。如果原始集合是分片的,您还必须对重新创建的集合进行分片

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

通过指定一个空的查询条件一个limit0来删除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 } }
]
})

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

版本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.ok

命令的状态。

delete.n

被删除的文档数量。

delete.writeErrors

包含有关删除操作期间遇到的任何错误信息的文档数组。`writeErrors` 数组包含每个出错删除语句的错误文档。

每个错误文档包含以下信息

delete.writeErrors.index

一个整数,用于标识deletes数组中的删除语句,使用零索引。

delete.writeErrors.code

一个标识错误的整数值。

delete.writeErrors.errmsg

错误描述。

delete.writeConcernError

描述与写入关注点相关的错误文档。

已更改版本7.1: 当在 delete 执行于 mongos 时,即使发生一个或多个写入错误,也会始终报告写入关注错误。

在之前的版本中,写入错误的发生可能导致 delete 不报告写入关注错误。

包含以下字段的 writeConcernError 文档

delete.writeConcernError.code

标识写入关注错误原因的整数值。

delete.writeConcernError.errmsg

写入关注错误原因的描述。

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
}

返回

查询 & 写入