Definition定义
db.collection.findOneAndDelete( filter, options )Deletes a single document based on the根据filterandsortcriteria, returning the deleted document.filter和sort条件删除单个文档,返回已删除的文档。ThefindOneAndDelete()method has the following form:findOneAndDelete()方法具有以下形式:db.collection.findOneAndDelete(
<filter>,
{
writeConcern: <document>,
projection: <document>,
sort: <document>,
maxTimeMS: <number>,
collation: <document>
}
)ThefindOneAndDelete()method takes the following parameters:findOneAndDelete()方法接受以下参数:Parameter参数Type类型Description描述filterdocument文档The selection criteria for the deletion.删除的选择标准。The same query selectors as in the可以使用与find()method are available.find()方法中相同的查询选择器。Specify an empty document指定一个空文档{ }to delete the first document returned in the collection.{ }以删除集合中返回的第一个文档。If unspecified, defaults to an empty document.如果未指定,则默认为空文档。If the query argument is not a document, the operation errors.如果查询参数不是文档,则操作会出错。writeConcerndocument文档Optional.可选。A document expressing the write concern. Omit to use the default write concern.表达写入关注的文档。省略使用默认写入关注。{ w: <value>, j: <boolean>, wtimeout: <number> }See Delete A Document Using WriteConcern for usage.有关用法,请参阅使用WriteConcern删除文档。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.如果在事务中运行,则不要显式设置操作的写入关注。要对事务使用写关注,请参阅事务和写关注。projectiondocument文档Optional.可选。A subset of fields to return.要返回的字段子集。To return all fields in the returned document, omit this parameter.要返回返回文档中的所有字段,请省略此参数。If the projection argument is not a document, the operation errors.如果投影参数不是文档,则操作会出错。sortdocument文档Optional.可选。Specifies a sorting order for the documents matched by the指定filter.filter匹配的文档的排序顺序。If the sort argument is not a document, the operation errors.如果排序参数不是文档,则操作会出错。See
cursor.sort().maxTimeMSnumber数字Optional.可选。Specifies a time limit in milliseconds within which the operation must complete within. Throws an error if the limit is exceeded.指定操作必须在毫秒内完成的时间限制。如果超过限制,则抛出错误。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指定排序规则时,localefield is mandatory; all other collation fields are optional. For descriptions of the fields, see Collation Document.locale字段是必填的;所有其他排序字段都是可选的。有关字段的描述,请参阅排序规则文档。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.不能为操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果使用排序执行查找,则不能对查找使用一个排序规则,对排序使用另一个。Returns:返回Returns the deleted document.返回已删除的文档。
Compatibility兼容性
This method is available in deployments hosted in the following environments:此方法在以下环境中托管的部署中可用:
- MongoDB Atlas
: The fully managed service for MongoDB deployments in the cloud:云中MongoDB部署的完全托管服务
Note
This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.所有MongoDB Atlas集群都支持此命令。有关Atlas支持所有命令的信息,请参阅不支持的命令。
- MongoDB Enterprise
: The subscription-based, self-managed version of MongoDB:MongoDB的基于订阅的自我管理版本 - MongoDB Community
: The source-available, free-to-use, and self-managed version of MongoDB:MongoDB的源代码可用、免费使用和自我管理版本
Behavior行为
Document Match文档匹配
findOneAndDelete() deletes the first matching document in the collection that matches the 删除集合中与filter. The sort parameter can be used to influence which document is deleted.filter匹配的第一个匹配文档。sort参数可用于影响删除哪个文档。
Projection投影
Important
Language Consistency语言一致性
As part of making 作为使find() and findAndModify() projection consistent with aggregation's $project stage,find()和findAndModify()投影与聚合的$project阶段一致的一部分,
Thefind()andfindAndModify()projection can accept aggregation expressions and syntax.find()和findAndModify()投影可以接受聚合表达式和语法。MongoDB enforces additional restrictions with regards to projections. See Projection Restrictions for details.MongoDB对预测实施了额外的限制。有关详细信息,请参阅投影限制。
The projection parameter takes a document in the following form:projection参数采用以下形式的文档:
{ field1: <value>, field2: <value> ... }
<field>: <1 or true> | true.true。 |
<field>: <0 or false> | |
"<field>.$": <1 or true> |
|
<field>: <array projection> |
|
<field>: <aggregation expression> |
|
Embedded Field Specification嵌入式字段规范
For fields in an embedded documents, you can specify the field using either:对于嵌入文档中的字段,您可以使用以下任一方式指定字段:
dot notation, for example点符号,例如"field.nestedfield": <value>nested form, for example嵌套形式,例如{ field: { nestedfield: <value> } }
_id Field Projection字段投影
The 默认情况下,_id field is included in the returned documents by default unless you explicitly specify _id: 0 in the projection to suppress the field._id字段包含在返回的文档中,除非您在投影中明确指定_id:0以抑制该字段。
Inclusion or Exclusion纳入或排除
A 投影不能同时包含纳入式和规范和排除式规范,projection cannot contain both include and exclude specifications, with the exception of the _id field:_id字段除外:
In projections that explicitly include fields, the在显式纳入字段的投影中,_idfield is the only field that you can explicitly exclude._id字段是唯一可以显式排除的字段。In projections that explicitly excludes fields, the在显式排除字段的投影中,_idfield is the only field that you can explicitly include; however, the_idfield is included by default._id字段是唯一可以明确包含的字段;但是,默认情况下包含_id字段。
For more information on projection, see also:有关投影的更多信息,请参阅:
Sharded Collections分片化集合
Documents in a sharded collection can be missing the shard key fields. 分片集合中的文档可能缺少分片键字段。To target a document that is missing the shard key, you can use the 要针对缺少分片键的文档,您可以将空相等匹配与另一个筛选条件结合使用(例如在null equality match in conjunction with another filter condition (such as on the _id field). For example:_id字段上)。例如:
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard keyTransactions事务
db.collection.findOneAndDelete() can be used inside distributed 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, a distributed transaction incurs a greater performance cost over single document writes, and the availability of distributed 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 distributed transactions.也就是说,对于许多场景,适当地对数据进行建模将最大限度地减少对分布式事务的需求。
For additional transactions usage considerations (such as runtime limit and oplog size limit), see also Production Considerations.有关其他事务使用注意事项(如运行时限制和oplog大小限制),另请参阅生产注意事项。
Oplog Entries操作日志条目
If a 如果db.collection.findOneAndDelete() operation successfully deletes a document, the operation adds an entry on the oplog (operations log). db.collection.findOneAndDelete()操作成功删除文档,则该操作会在oplog(操作日志)上添加一个条目。If the operation fails or does not find a document to delete, the operation does not add an entry on the oplog.如果操作失败或找不到要删除的文档,则操作不会在oplog上添加条目。
Examples示例
Delete A Document删除文档
The scores collection contains documents similar to the following:scores集合包含类似于以下内容的文档:
db.scores.insertMany( [
{ _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 },
{ _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 },
{ _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 },
{ _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 },
{ _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 },
{ _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 }
] )
The following operation finds the first document where 以下操作找到名为name : M. Tagnum and deletes it:name : M. Tagnum的第一个文档并将其删除:
db.scores.findOneAndDelete(
{ "name" : "M. Tagnum" }
)
The operation returns the original document that has been deleted:该操作返回已删除的原始文档:
{ _id: 6312, name: "M. Tagnum", "assignment" : 5, "points" : 30 }Delete A Document Using WriteConcern使用WriteConcern删除文档
The scores collection contains documents similar to the following:scores集合包含类似于以下内容的文档:
db.scores.insertMany( [
{ _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 },
{ _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 },
{ _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 },
{ _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 },
{ _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 },
{ _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 }
] )
The following operation uses a write concern document inside of the 以下操作在db.collection.findOneAndDelete() method with options:db.collection.findOneAndDelete()方法中使用带有选项的写关注文档:
w:1to requests acknowledgment that the write operation has propagated to the standalone mongod or the primary in a replica set.请求确认写入操作已传播到独立mongod或副本集中的主服务器。j:trueto tell the number of MongoDB instances specified in告诉w:1to have the delete written to on-disk journel.w:1中指定的要将delete写入磁盘journel的MongoDB实例的数量。wtimeout : 1000to specify a time limit, in milliseconds, for the write concern.为写入关注指定时间限制(以毫秒为单位)。wtimeoutis only applicable forwvalues greater than 1.wtimeout仅适用于大于1的w值。
db.scores.findOneAndDelete(
{ name: "A. MacDyver" },
{
writeConcern: {
w : 1,
j : true,
wtimeout : 1000
}
}
)
The operation returns the following document:该操作返回以下文档:
{ _id: 6305, name: 'A. MacDyver', assignment: 5, points: 24 }
The document is deleted with the writeConcern options specified.使用指定的writeConcern选项删除文档。
Sort And Delete A Document排序和删除文档
The scores collection contains documents similar to the following:scores集合包含类似于以下内容的文档:
db.scores.insertMany( [
{ _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 },
{ _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 },
{ _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 },
{ _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 },
{ _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 },
{ _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 }
] )
The following operation first finds all documents where 以下操作首先查找name : "A. MacDyver". It then sorts by points ascending before deleting the document with the lowest points value:name : "A. MacDyver"的所有文档。然后,在删除具有最低点值的文档之前,它按points升序排序:
db.scores.findOneAndDelete(
{ "name" : "A. MacDyver" },
{ sort : { "points" : 1 } }
)
The operation returns the original document that has been deleted:该操作返回已删除的原始文档:
{ _id: 6322, name: "A. MacDyver", "assignment" : 2, "points" : 14 }Projecting the Deleted Document投影已删除的文档
The following operation uses projection to only return the 以下操作使用投影仅返回返回文档中的_id and assignment fields in the returned document:_id和assignment字段:
db.scores.findOneAndDelete(
{ "name" : "A. MacDyver" },
{ sort : { "points" : 1 }, projection: { "assignment" : 1 } }
)
The operation returns the original document with the 该操作返回带有assignment and _id fields:assignment和_id字段的原始文档:
{ _id: 6322, "assignment" : 2 }Update Document with Time Limit按时间限制更新文档
The following operation sets a 5ms time limit to complete the deletion:以下操作设置了5ms的时间限制来完成删除:
try {
db.scores.findOneAndDelete(
{ "name" : "A. MacDyver" },
{ sort : { "points" : 1 }, maxTimeMS : 5 }
)
}
catch(e){
print(e)
}
If the operation exceeds the time limit, it returns:如果操作超过时间限制,则返回:
MongoServerError: operation exceeded time limit: { "ok": 0, "code" : 50, "codeName" : "MaxTimeMSExpired" }
Note
This error message has been shortened for brevity.为了简洁起见,此错误消息已被缩短。
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集合有以下文件:
db.myColl.insertMany( [
{ _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.findOneAndDelete(
{ category: "cafe", status: "a" },
{ collation: { locale: "fr", strength: 1 } }
);
The operation returns the following document:该操作返回以下文档:
{ "_id" : 1, "category" : "café", "status" : "A" }