db.collection.remove()
定义
db.collection.remove()
从集合中删除文档。
返回: 一个包含该操作状态的 WriteResult 对象。
兼容性
可以使用 db.collection.remove()
查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
db.collection.remove()
方法有两种语法。remove()
方法可以采用查询文档和可选的 justOne
布尔值:
db.collection.remove( <query>, <justOne> )
该方法也可以采用查询文档和可选的删除选项文档:
5.0 版本中的更改。
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document>, collation: <document>, let: <document> // Added in MongoDB 5.0 } )
remove()
方法使用以下参数:
Parameter | 类型 | 说明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
query | 文档 | 使用查询运算符指定删除条件。要删除集合中的所有文档,请传递空文档 ( {} )。 | ||||||||||
justOne | 布尔 | 可选。要将删除限制为仅删除一个文档,请设置为 true 。忽略,使用默认值 false 并删除所有符合删除条件的文档。 | ||||||||||
writeConcern | 文档 | |||||||||||
collation | 文档 | 可选。 指定用于操作的排序规则。 排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。 排序规则选项的语法如下:
指定排序规则时, 如果未指定排序规则,但集合具有默认排序规则(请参阅 如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。 | ||||||||||
文档 | 可选。.. include:: /includes/let-variables-syntax.rst .. include:: /includes/let-variables-syntax-note.rst 有关使用 版本 5.0 中的新增功能。 |
行为
写关注
remove()
方法使用 delete
命令,该命令使用默认的写关注。要指定不同的写关注,请将写关注包含在 options 参数中。
查询注意事项
默认情况下,remove()
会删除所有匹配 query
表达式的文档。指定 justOne
选项以将该操作限制为删除单个文档。要删除按指定顺序排列的单个文档,请使用 findAndModify() 方法。
删除多个文档时,删除操作可能会与集合的其他读取和/或写入操作交错。
时间序列集合
分片集合
要对指定 justOne: true
选项的分片集合使用 remove()
操作:
如果您仅针对一个分片,则可以在查询规范中使用部分分片键,或者
您可以在查询规范中提供分片键或
_id
字段。
事务
db.collection.remove()
可以在分布式事务中使用。
如果是在事务中运行,则请勿显式设置此操作的写关注。要将写关注与事务一起使用,请参阅事务和写关注。
重要
在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。
有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项。
示例
以下是 remove()
方法的示例。
从集合中删除所有文档
要删除集合中的所有文档,请调用带有空文档 {}
的 remove
方法。以下操作会删除 bios 集合中的所有文档:
db.bios.remove( { } )
此操作不等同于 drop()
方法。
要从集合中删除所有文档,更高效的做法是使用 drop()
方法删除整个集合(包括索引),然后重新创建该集合并重建索引。
删除匹配条件的所有文档
如要删除匹配删除条件的文档,请调用带有 <query>
参数的 remove()
方法:
以下操作会删除集合 products
中 qty
大于 20
的所有文档:
db.products.remove( { qty: { $gt: 20 } } )
覆盖默认写关注
以下对副本集的操作将从集合 products
中删除 qty
大于 20
的所有文档并指定写关注 w: 2
,其中 wtimeout
为 5000 毫秒。此操作要么在写入传播到主节点和一个从节点后返回,要么在 5 秒后超时。
db.products.remove( { qty: { $gt: 20 } }, { writeConcern: { w: "majority", wtimeout: 5000 } } )
删除与条件匹配的单个文档
要删除第一个符合删除条件的文档,请调用 remove
方法,并将 query
条件和 justOne
参数设置为 true
或 1
。
以下操作从集合 products
中删除 qty
大于 20
的第一份文档:
db.products.remove( { qty: { $gt: 20 } }, true )
指定排序规则。
排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。
集合 myColl
包含以下文档:
{ _id: 1, category: "café", status: "A" } { _id: 2, category: "cafe", status: "a" } { _id: 3, category: "cafE", status: "a" }
以下操作包括排序规则选项:
db.myColl.remove( { category: "cafe", status: "A" }, { collation: { locale: "fr", strength: 1 } } )
使用以下项中的变量: let
版本 5.0 中的新增功能。
要定义可在命令中其他位置访问的变量,请使用 let 选项。
注意
要使用变量筛选结果,您必须在 $expr
操作符中访问该变量。
创建集合 cakeFlavors
:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
以下示例在 let
中定义了一个 targetFlavor
变量,并使用该变量删除草莓蛋糕口味:
db.cakeFlavors.remove( { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, { let : { targetFlavor: "strawberry" } } )
WriteResult
成功结果
remove()
会返回一个包含操作状态的 WriteResult()
对象。成功后,WriteResult()
对象将包含被删除文档数量的信息。
WriteResult({ "nRemoved" : 4 })
写关注错误
如果 remove()
方法遇到写关注错误,结果将包括 WriteResult.writeConcernError
字段:
WriteResult({ "nRemoved" : 7, "writeConcernError" : { "code" : 64, "codeName" : "WriteConcernFailed", "errmsg" : "waiting for replication timed out", "errInfo" : { "wtimeout" : true, "writeConcern" : { "w" : "majority", "wtimeout" : 1, "provenance" : "getLastErrorDefaults" } } } })
与写关注无关的错误
如果 remove()
方法遇到非写关注错误,结果将包括 WriteResult.writeError
字段:
WriteResult({ "nRemoved" : 0, "writeError" : { "code" : 2, "errmsg" : "unknown top level operator: $invalidFieldName" } })