参考 > 参考 > mongo Shell方法 > 收集方法 > db.collection.findOneAndUpdate()
db.collection.
findOneAndUpdate
(filter,update,options )¶mongo
壳法
此页面记录了mongo
shell方法,并且
没有引用MongoDB Node.js驱动程序(或任何其他驱动程序)方法。对于相应的MongoDB驱动程序API,请改为参考您特定的
MongoDB驱动程序文档。
3.2版中的新功能。
根据filter
和
sort
标准更新单个文档。
该findOneAndUpdate()
方法具有以下形式:
该findOneAndUpdate()
方法采用以下参数:
参数 | 类型 | 描述 |
---|---|---|
filter |
文献 |
指定一个空文档以更新集合中返回的第一个文档。 如果未指定,则默认为空文档。 从MongoDB 4.2(和4.0.12 +,3.6.14 +和3.4.23+)开始,如果查询参数不是文档,则操作错误。 |
update |
文件或阵列 | 更新文档,或者从MongoDB 4.2开始的聚合管道。
|
projection |
文献 | 可选的。要返回的字段子集。 要返回返回文档中的所有字段,请省略此参数。 从MongoDB 4.2(和4.0.12 +,3.6.14 +和3.4.23+)开始,如果projection参数不是文档,则操作会出错。 |
sort |
文献 | 可选的。指定与匹配的文档的排序顺序 从MongoDB 4.2(和4.0.12 +,3.6.14 +和3.4.23+)开始,如果sort参数不是文档,则操作会出错。 请参阅 |
maxTimeMS |
数 | 可选的。指定操作必须在其内完成的时间限制(以毫秒为单位)。如果超出限制,则会引发错误。 |
upsert |
布尔值 | 可选的。当
为避免多次更新,请确保 默认为 |
returnNewDocument |
布尔值 | 可选的。如果为 默认为 |
collation |
文献 | 可选的。 指定 用于操作的排序规则。 归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 排序规则选项具有以下语法: 指定排序规则时,该 如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料 如果没有为集合或操作指定排序规则,则MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。 3.4版的新功能。 |
arrayFilters |
数组 | 可选的。筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素。 在更新文档中,使用 注意 在 您可以在更新文档中多次包含相同的标识符;但是,对于 但是,您可以在单个过滤器文档中的相同标识符上指定复合条件,例如以下示例: 有关示例,请参见使用arrayFilters进行数组更新操作。 注意
3.6版的新功能。 |
返回值: | 返回原始文档,或者如果更新的文档,则返回。returnNewDocument: true |
---|
db.collection.findOneAndUpdate()
更新集合中与匹配的第一个匹配文档filter
。该sort
参数可用于影响哪个文档被更新。
该projection
参数采用以下格式的文档:
该<boolean>
值可以是以下任意值:
1
或true
包含该字段。_id
即使未在projection参数中明确说明该方法,该方法也会返回该
字段。0
或false
排除该字段。可以在任何字段(包括)上使用_id
。要db.collection.findOneAndUpdate()
在分片集合上使用,查询过滤器必须在分片键上包含相等条件。
从MongoDB 4.2开始,除非分片键字段是不可变_id
字段,否则您可以更新文档的分片键值。有关更新分片键的详细信息,请参阅“ 更改文档的分片键值”。
在MongoDB 4.2之前,文档的分片键字段值是不可变的。
要用于 db.collection.findOneAndUpdate()
更新分片键:
db.collection.findOneAndUpdate()
可以在多文档交易中使用。
重要
在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)对于您的数据和用例将继续是最佳的。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档交易的需求。
有关其他事务使用方面的注意事项(例如运行时限制和oplog大小限制),另请参见 生产注意事项。
在事务内部,您可以指定对现有集合的读/写操作。如果db.collection.findOneAndUpdate()
导致upsert,则该集合必须已经存在。
如果该操作导致upsert,则该集合必须已经存在。
该grades
集合包含与以下内容相似的文档:
以下操作将查找第一个文档,
并将分数提高:name : R. Stiles
5
该操作返回更新之前的原始文档:
如果returnNewDocument
为true,则该操作将返回更新的文档。
该grades
集合包含与以下内容相似的文档:
以下操作将更新文档,其中。该操作通过升序对匹配的文档进行排序,以最少的点数更新匹配的文档。name : "A. MacDyver"
points
该操作返回更新之前的原始文档:
以下操作使用投影到只显示_id
,
points
和assignment
返回的文档中的字段:
该操作仅返回原始文档以及仅在projection
文档中指定的字段和该_id
字段,因为该字段在投影文档中未显式抑制()。_id: 0
upsert
如果没有任何匹配项,以下操作将使用该字段插入更新文档filter
:
该操作返回以下内容:
如果returnNewDocument
为假,操作将返回,null
因为没有原始文档要返回。
arrayFilters
¶注意
arrayFilters
不适用于使用聚合管道的更新。
3.6版的新功能。
从MongoDB 3.6开始,在更新数组字段时,您可以指定arrayFilters
确定要更新的数组元素。
arrayFilters
条件¶注意
arrayFilters
不适用于使用聚合管道的更新。
students
使用以下文档创建一个集合:
要修改是大于或等于所有元素100
中
grades
阵列中,使用过滤的位置操作者
$[<identifier>]
与arrayFilters
在选项
db.collection.findOneAndUpdate
方法:
该操作将更新grades
单个文档的字段,并且在操作之后,集合将包含以下文档: