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

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

db.collection.deleteOne()

带驱动程序的 MongoDB

This page documents a mongosh method. To see the equivalent method in a MongoDB driver, see the corresponding page for your programming language:

从集合中删除单个文档。

返回:

文档包含以下内容:

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

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

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

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

注意

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

db.collection.deleteOne() 采用以下形式:

db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>,
hint: <document|string>,
maxTimeMS: <int>,
let: <document>
}
)

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

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 变量进行更新

deleteOne() 删除与过滤器匹配的第一个文档。使用作为唯一索引一部分的字段(例如 _id)进行精确删除。

要在分片集合上使用 deleteOne()

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

  • 您不需要在查询规范中提供分片键_id字段,因为 deleteOne() 本质上使用 1 的限制。

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

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

重要

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

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

如果 db.collection.deleteOne() 操作成功删除文档,则该操作会为 oplog (操作日志)添加一个条目。如果操作失败或未找到要删除的文档,则该操作不会为 oplog 添加条目。

orders 集合包含具有以下结构的文档:

db.orders.insertOne(
{
_id: ObjectId("563237a41a4d68582c2509da"),
stock: "Brent Crude Futures",
qty: 250,
type: "buy-limit",
limit: 48.90,
creationts: ISODate("2015-11-01T12:30:15Z"),
expiryts: ISODate("2015-11-01T12:35:15Z"),
client: "Crude Traders Inc."
}
)

以下操作删除带有 _id: ObjectId("563237a41a4d68582c2509da") 的命令:

try {
db.orders.deleteOne( { _id: ObjectId("563237a41a4d68582c2509da") } );
} catch (e) {
print(e);
}

该操作返回:

{ acknowledged: true, deletedCount: 1 }

以下操作将删除 expiryts 大于 ISODate("2015-11-01T12:40:15Z") 的第一个文档

try {
db.orders.deleteOne( { expiryts: { $lt: ISODate("2015-11-01T12:40:15Z") } } );
} catch (e) {
print(e);
}

该操作返回:

{ acknowledged: true, deletedCount: 1 }

以下操作删除与类型 buy-limit 匹配的文档,limit 小于变量 priceThreshold,并设置 3 秒的时间限制:

try {
db.orders.deleteOne(
{ type: "buy-limit" },
{ $expr: { $eq: ["$limit", "$$priceThreshold"] } },
{
let: { priceThreshold: 49.00 },
maxTimeMS: 3000
}
);
} catch (e) {
print(e);
}

该操作返回:

{ acknowledged: true, deletedCount: 1 }

给定一个三节点副本集,以下操作指定 wmajority,指定 wtimeout100

try {
db.orders.deleteOne(
{ _id: ObjectId("563237a41a4d68582c2509da") },
{ w: "majority", wtimeout: 100 }
);
} catch (e) {
print (e);
}

如果确认花费的时间超过wtimeout限制,则会引发以下异常:

WriteConcernError({
code: 64,
errmsg: "waiting for replication timed out",
errInfo: {
wtimeout: true,
writeConcern: {
w: "majority",
wtimeout: 100,
provenance: "getLastErrorDefaults"
}
}
})

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

集合 restaurants 包含以下文档:

db.restaurants.insertMany( [
{ _id: 1, category: "café", status: "Open" },
{ _id: 2, category: "cafe", status: "open" },
{ _id: 3, category: "cafE", status: "open" }
] )

以下操作包括排序规则选项:

db.restaurants.deleteOne(
{ category: "cafe", status: "Open" },
{ collation: { locale: "fr", strength: 1 } }
)

删除过滤指定带有 strength: 1 的排序规则,这意味着排序规则忽略大小写和字母变体之间的差异。因此,即使没有与过滤中指定的大小写和字母变体完全匹配的文档,该操作仍会匹配并删除文档。

In mongosh, create a students collection with the following documents:

db.members.insertMany( [
{ _id: 1, student: "Richard", grade: "F", points: 0 },
{ _id: 2, student: "Jane", grade: "A", points: 60 },
{ _id: 3, student: "Adam", grade: "F", points: 0 },
{ _id: 4, student: "Ronan", grade: "D", points: 20 },
{ _id: 5, student: "Noah", grade: "F", points: 0 },
{ _id: 6, student: "Henry", grade: "A", points: 86 }
] )

在集合上创建以下索引:

db.members.createIndex( { grade: 1 } )

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

db.members.deleteOne(
{ points: { $lte: 20 }, grade: "F" },
{ hint: { grade: 1 } }
)

注意

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

删除命令返回以下内容:

{ acknowledged: true, deletedCount: 1 }

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

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

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

给本页内容打分