db.collection.remove()

On this page本页内容

Important重要
Deprecated mongosh Method弃用的mongosh方法

This method is deprecated in mongosh. 此方法在mongosh中已弃用。For alternative methods, see Compatibility Changes with Legacy mongo Shell.有关其他方法,请参阅与旧mongo Shell的兼容性更改

Definition定义

db.collection.remove()

Removes documents from a collection.从集合中删除文档。

The db.collection.remove() method can have one of two syntaxes. db.collection.remove()方法可以有两种语法之一。The remove() method can take a query document and an optional justOne boolean:remove()方法可以接受查询文档和可选的justOne布尔值:

db.collection.remove(
   <query>,
   <justOne>
)

Or the method can take a query document and an optional remove options document:或者该方法可以采用查询文档和可选的移除选项文档:

Changed in version 5.0.在版本5.0中更改

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     let: <document> // Added in MongoDB 5.0
   }
)
Parameter参数Type类型Description描述
querydocumentSpecifies deletion criteria using query operators. 使用查询运算符指定删除条件。To delete all documents in a collection, pass an empty document ({}).若要删除集合中的所有文档,请传递一个空文档({})。
justOnebooleanOptional. 可选。To limit the deletion to just one document, set to true. 要将删除限制为一个文档,请设置为trueOmit to use the default value of false and delete all documents matching the deletion criteria.省略以使用默认值false并删除所有符合删除条件的文档。
writeConcerndocument

Optional. 可选。A document expressing the write concern. 表示写入关注点的文件。Omit to use the default write concern. 省略以使用默认写入关注点。See Write Concern.请参阅写入关注点

Do not explicitly set the write concern for the operation if run in a transaction. 如果在事务中运行,请不要显式设置操作的写入关注点。To use write concern with transactions, see Transactions and Write Concern.要将写关注点用于事务,请参阅事务和写关注点

collationdocument

Optional.可选。

Specifies the collation to use for the operation.指定用于操作的排序规则

Collation allows users to specify language-specific rules for string comparison, such as rules for lettercase and accent marks.允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音标记的规则。

The collation option has the following syntax:排序规则选项具有以下语法:

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

When specifying collation, the locale field is mandatory; all other collation fields are optional. 指定排序规则时,locale字段是必填字段;所有其他排序规则字段都是可选的。For descriptions of the fields, see Collation Document.有关字段的说明,请参阅排序规则文档

If the collation is unspecified but the collection has a default collation (see db.createCollection()), the operation uses the collation specified for the collection.如果未指定排序规则,但集合具有默认排序规则(请参见db.createCollection()),则操作将使用为集合指定的排序规则。

If no collation is specified for the collection or for the operations, MongoDB uses the simple binary comparison used in prior versions for string comparisons.如果没有为集合或操作指定排序规则,MongoDB将使用以前版本中使用的简单二进制比较进行字符串比较。

You cannot specify multiple collations for an operation. 不能为一个操作指定多个排序规则。For example, you cannot specify different collations per field, or if performing a find with a sort, you cannot use one collation for the find and another for the sort.例如,您不能为每个字段指定不同的排序规则,或者如果使用排序执行查找,则不能将一种排序规则用于查找,另一种用于排序。

letdocument

Optional.可选。

Specifies a document with a list of variables. 指定具有变量列表的文档。This allows you to improve command readability by separating the variables from the query text.这允许您通过将变量与查询文本分离来提高命令的可读性。

The document syntax is:文档语法为:

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

The variable is set to the value returned by the expression, and cannot be changed afterwards.变量被设置为表达式返回的值,以后不能更改。

To access the value of a variable in the command, use the double dollar sign prefix ($$) together with your variable name in the form $$<variable_name>. 要在命令中访问变量的值,请使用双美元符号前缀($$)以及格式为$$<variable_name>的变量名。For example: $$targetTotal.例如:$$targetTotal

Note注意

To use a variable to filter results, you must access the variable within the $expr operator.要使用变量筛选结果,必须在$expr运算符中访问变量。

For a complete example using let and variables, see Use Variables in let.有关使用let和变量的完整示例,请参阅let中使用变量

New in version 5.0.在版本5.0中新增

The remove() returns an object that contains the status of the operation.remove()返回包含操作状态的对象。

Returns:返回:A WriteResult object that contains the status of the operation.包含操作状态的WriteResult对象。

Behavior行为

Write Concern写入关注点

The remove() method uses the delete command, which uses the default write concern. remove()方法使用delete命令,该命令使用默认的写关注点。To specify a different write concern, include the write concern in the options parameter.要指定不同的写关注点,请在options参数中包含写关注点。

Query Considerations查询注意事项

By default, remove() removes all documents that match the query expression. 默认情况下,remove()会删除与query表达式匹配的所有文档。Specify the justOne option to limit the operation to removing a single document. 指定justOne选项以将操作限制为删除单个文档。To delete a single document sorted by a specified order, use the findAndModify() method.要删除按指定顺序排序的单个文档,请使用findAndModify()方法。

When removing multiple documents, the remove operation may interleave with other read and/or write operations to the collection.移除多个文档时,移除操作可能会与对集合的其他读取和/或写入操作交错。

Capped Collections封顶集合

You cannot use the remove() method with a capped collection.不能将remove()方法用于封顶集合

Time Series Collections时间序列集合

You cannot use the remove() method on a time series collection.不能对时间序列集合使用remove()方法。

Sharded Collections分片集合

All remove() operations for a sharded collection that specify the justOne: true option must include the shard key or the _id field in the query specification.指定justOne:true选项的分片集合的所有remove()操作必须在查询规范中包含分片键或_id字段。

remove() operations specifying justOne: true in a sharded collection which do not contain either the shard key or the _id field return an error.在不包含shard键或_id字段的分片集合中指定justOne:trueremove()操作返回错误。

Transactions事务

db.collection.remove() can be used inside multi-document transactions.可以在多文档事务处理中使用。

Do not explicitly set the write concern for the operation if run in a transaction. 如果在事务中运行,请不要显式设置操作的写入关注点。To use write concern with transactions, see Transactions and Write Concern.要将写关注点用于事务,请参阅事务和写关注点

Important重要

In most cases, multi-document transaction incurs a greater performance cost over single document writes, and the availability of multi-document transactions should not be a replacement for effective schema design. 在大多数情况下,多文档事务比单文档写入带来更高的性能成本,并且多文档事务的可用性不应取代有效的模式设计。For many scenarios, the denormalized data model (embedded documents and arrays) will continue to be optimal for your data and use cases. 对于许多场景,非规范化的数据模型(嵌入式文档和数组)将继续最适合您的数据和用例。That is, for many scenarios, modeling your data appropriately will minimize the need for multi-document transactions.也就是说,对于许多场景,适当地建模您的数据将最小化对多文档事务的需要。

For additional transactions usage considerations (such as runtime limit and oplog size limit), see also Production Considerations.有关其他事务使用注意事项(如运行时限制和oplog大小限制),请参阅生产注意事项

Examples示例

The following are examples of the remove() method.下面是remove()方法的示例。

Remove All Documents from a Collection从集合中删除所有文档

To remove all documents in a collection, call the remove method with an empty query document {}. 若要删除集合中的所有文档,请使用空查询文档{}调用remove方法。The following operation deletes all documents from the bios collection:以下操作将从bios集合中删除所有文档:

db.bios.remove( { } )

This operation is not equivalent to the drop() method.此操作不等同于drop()方法。

To remove all documents from a collection, it may be more efficient to use the drop() method to drop the entire collection, including the indexes, and then recreate the collection and rebuild the indexes.要从集合中删除所有文档,使用drop()方法删除整个集合(包括索引),然后重新创建集合并重新生成索引可能会更有效。

Remove All Documents that Match a Condition删除所有符合条件的文档

To remove the documents that match a deletion criteria, call the remove() method with the <query> parameter:要删除符合删除条件的文档,请使用<query>参数调用remove()方法:

The following operation removes all the documents from the collection products where qty is greater than 20:以下操作将从集合products中删除所有qty大于20的文档:

db.products.remove( { qty: { $gt: 20 } } )

Override Default Write Concern覆盖默认写入问题

The following operation to a replica set removes all the documents from the collection products where qty is greater than 20 and specifies a write concern of w: 2 with a wtimeout of 5000 milliseconds. 以下对副本集的操作将从集合products中删除所有qty大于20的文档,并指定写入关注点w:2wtimeout为5000毫秒。This operation either returns after the write propagates to both the primary and one secondary, or times out after 5 seconds.此操作要么在写入传播到主服务器和一个辅助服务器之后返回,要么在5秒后超时。

db.products.remove(
    { qty: { $gt: 20 } },
    { writeConcern: { w: "majority", wtimeout: 5000 } }
)

Remove a Single Document that Matches a Condition删除与条件匹配的单个文档

To remove the first document that match a deletion criteria, call the remove method with the query criteria and the justOne parameter set to true or 1.要删除与删除条件匹配的第一个文档,请在查询条件和justOne参数设置为true1的情况下调用remove方法。

The following operation removes the first document from the collection products where qty is greater than 20:以下操作从集合products中删除第一张qty大于20的单据:

db.products.remove( { qty: { $gt: 20 } }, true )

Specify Collation指定排序规则

Collation allows users to specify language-specific rules for string comparison, such as rules for lettercase and accent marks.允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音标记的规则。

A collection myColl has the following documents:myColl集合包含以下文档:

{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

The following operation includes the collation option:以下操作包括collation选项:

db.myColl.remove(
   { category: "cafe", status: "A" },
   { collation: { locale: "fr", strength: 1 } }
)

Use Variables in letlet中使用变量

New in version 5.0.在版本5.0中新增

To define variables that you can access elsewhere in the command, use the let option.要定义可以在命令的其他地方访问的变量,请使用let选项。

Note注意

To filter results using a variable, you must access the variable within the $expr operator.要使用变量筛选结果,必须在$expr运算符中访问变量。

Create a collection cakeFlavors:创建集合cakeFlavors

db.cakeFlavors.insertMany( [
   { _id: 1, flavor: "chocolate" },
   { _id: 2, flavor: "strawberry" },
   { _id: 3, flavor: "cherry" }
] )

The following example defines a targetFlavor variable in let and uses the variable to delete the strawberry cake flavor:以下示例在let中定义了targetFlavor变量,并使用该变量删除草莓蛋糕风味:

db.cakeFlavors.remove(
   { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
   { let : { targetFlavor: "strawberry" } }
)

WriteResult

Successful Results成功的结果

The remove() returns a WriteResult() object that contains the status of the operation. remove()返回包含操作状态的WriteResult()对象。Upon success, the WriteResult() object contains information on the number of documents removed:成功后,WriteResult()对象包含有关删除文档数量的信息:

WriteResult({ "nRemoved" : 4 })
Tip提示
See also: 参阅:

Write Concern Errors写入关注点错误

If the remove() method encounters write concern errors, the results include the WriteResult.writeConcernError field:如果remove()方法遇到写入关注点错误,则结果包括WriteResult.writeConcernError字段:

WriteResult({
  "nRemoved" : 7,
  "writeConcernError" : {
    "code" : 64,
    "codeName" : "WriteConcernFailed",
    "errmsg" : "waiting for replication timed out",
    "errInfo" : {
      "wtimeout" : true,
      "writeConcern" : {
    // Added in MongoDB 4.4
        "w" : "majority",
        "wtimeout" : 1,
        "provenance" : "getLastErrorDefaults"
      }
    }
  }
})

Errors Unrelated to Write Concern与写入问题无关的错误

If the remove() method encounters a non-write concern error, the results include WriteResult.writeError field:如果remove()方法遇到非写入问题错误,则结果包括WriteResult.writeError字段:

WriteResult({
   "nRemoved" : 0,
   "writeError" : {
      "code" : 2,
      "errmsg" : "unknown top level operator: $invalidFieldName"
   }
})
Tip提示
See also: 参阅:
←  db.collection.reIndex()db.collection.renameCollection() →