参考 > 参考 > mongo Shell方法 > 收集方法 > db.collection.findAndModify()
db.collection.
findAndModify
(文件)¶mongo
壳法
此页面记录了mongo
shell方法,并且
没有引用MongoDB Node.js驱动程序(或任何其他驱动程序)方法。对于相应的MongoDB驱动程序API,请改为参考您特定的
MongoDB驱动程序文档。
修改并返回单个文档。默认情况下,返回的文档不包括对更新所做的修改。要返回对更新进行了修改的文档,请使用new
选项。该findAndModify()
方法是findAndModify
命令周围的shell帮手。
该findAndModify()
方法具有以下形式:
该db.collection.findAndModify()
方法采用带有以下嵌入式文档字段的文档参数:
参数 | 类型 | 描述 |
---|---|---|
query |
文献 | 可选的。修改的选择标准。该 如果未指定,则默认为空文档。 从MongoDB 4.2(和4.0.12 +,3.6.14 +和3.4.23+)开始,如果查询参数不是文档,则操作错误。 |
sort |
文献 | 可选的。确定如果查询选择多个文档,则操作将修改哪个文档。 从MongoDB 4.2(和4.0.12 +,3.6.14 +和3.4.23+)开始,如果sort参数不是文档,则操作会出错。 |
remove |
布尔值 | 必须指定remove 或update 字段。删除在query 字段中指定的文档。设置此项以true
删除选定的文档。默认值为false 。 |
update |
文件或阵列 | 必须指定
|
new |
布尔值 | 可选的。当为时true ,返回修改后的文档而不是原始文档。该db.collection.findAndModify() 方法忽略
操作new 选项remove 。默认值为false 。 |
fields |
文献 | 可选的。要返回的字段子集。该 从MongoDB 4.2(和4.0.12 +,3.6.14 +和3.4.23+)开始,如果fields参数不是文档,则操作错误。 |
upsert |
布尔值 | 可选的。与 当
为避免多次更新,请确保 默认为 |
bypassDocumentValidation |
布尔值 | 可选的。允许 3.2版中的新功能。 |
writeConcern |
文献 | 可选的。表达书面关切的文件。省略使用默认的写关注。 如果在事务中运行,则不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。 3.2版中的新功能。 |
maxTimeMS |
整数 | 可选的。指定用于处理操作的时间限制(以毫秒为单位)。 |
collation |
文献 | 可选的。 指定 用于操作的排序规则。 归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 排序规则选项具有以下语法: 指定排序规则时,该 如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料 如果没有为集合或操作指定排序规则,则MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。 3.4版的新功能。 |
arrayFilters |
数组 | 可选的。筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素。 在更新文档中,使用 注意 在 您可以在更新文档中多次包含相同的标识符;但是,对于 但是,您可以在单个过滤器文档中的相同标识符上指定复合条件,例如以下示例: 有关示例,请参阅为数组更新操作指定arrayFilters。 注意
3.6版的新功能。 |
对于删除操作,如果查询与文档匹配,则
findAndModify()
返回删除的文档。如果查询与要删除的文档不匹配,则
findAndModify()
返回null
。
对于更新操作,findAndModify()
返回以下之一:
new
参数未设置或为false
:null
。new
是true
:upsert: true
null
。当findAndModify()
包含选项并且查询字段未唯一索引时,该方法在某些情况下可以多次插入文档。upsert:
true
在以下示例中,不Andy
存在具有该名称的文档,并且多个客户端发出以下命令:
然后,如果这些客户机的findAndModify()
方法query
在任何命令开始阶段之前完成了该
modify
阶段,并且该name
字段上没有唯一索引,则这些命令可能全部执行upsert,从而创建多个重复文档。
为防止创建多个具有相同名称的重复文档,请在
字段上创建唯一索引name
。有了此唯一索引,多种方法将表现出以下行为之一:
findAndModify()
成功插入了一个新文档。findAndModify()
方法将更新新插入的文档。findAndModify()
尝试插入相同名称的文档时,零个或多个方法失败。如果该方法由于在name
字段上违反唯一索引约束而失败
,则可以重试该方法。如果没有删除文档,重试应该不会失败。当使用findAndModify
在分片
环境中,query
必须包含关于平等条件
片键针对用于分片的集群中的所有操作分片集合。
findAndModify
针对非分片集合的mongos
实例发出的操作正常运行。
从MongoDB 4.2开始,除非分片键字段是不可变_id
字段,否则您可以更新文档的分片键值。有关更新分片键的详细信息,请参阅“ 更改文档的分片键值”。
在MongoDB 4.2之前,文档的分片键字段值是不可变的。
该db.collection.findAndModify()
方法增加了对该bypassDocumentValidation
选项的支持
,使您可以在使用验证规则向集合中插入或更新文档时绕过
文档验证。
update
方法的比较¶当更新一个文件,db.collection.findAndModify()
并且该
update()
方法不同地操作:
默认情况下,这两种操作都会修改单个文档。但是,该
update()
方法及其multi
选项可以修改多个文档。
如果多个文档符合的更新条件,则
db.collection.findAndModify()
可以指定sort
来提供对要更新的文档的某种控制措施。
使用该update()
方法的默认行为,当多个文档匹配时,您无法指定要更新哪个文档。
默认情况下,db.collection.findAndModify()
返回文档的预修改版本。要获取更新的文档,请使用new
选项。
该update()
方法返回一个
WriteResult
包含操作状态的对象。若要返回更新的文档,请使用find()
方法。但是,其他更新可能已在您的更新和文档检索之间修改了文档。另外,如果更新仅修改了一个文档,但匹配了多个文档,则您将需要使用其他逻辑来标识更新后的文档。
修改单个文档时,两者db.collection.findAndModify()
和
update()
方法都会自动更新文档。有关这些方法的交互作用和操作顺序的更多详细信息,请参见原子性和事务。
db.collection.findAndModify()
可以在多文档交易中使用。
重要
在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)对于您的数据和用例将继续是最佳的。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档交易的需求。
有关其他事务使用方面的注意事项(例如运行时限制和oplog大小限制),另请参见 生产注意事项。
在事务内部,您可以指定对现有集合的读/写操作。如果db.collection.findAndModify()
导致upsert,则该集合必须已经存在。
以下方法更新并返回人员集合中与查询条件相匹配的现有文档:
此方法执行以下操作:
在query
找到的文件people
,其中收集name
字段的值Tom
,该state
字段值active
和rating
字段的值10。greater than
该sort
订单升序排序查询的结果。如果多个文档满足query
条件,则该方法将选择按此命令修改的第一个文档sort
。
用1 更新字段increments
的值
score
。
该方法返回为此更新选择的原始(即预先修改)文档:
要返回修改后的文档,请将new:true
选项添加到方法中。
如果没有文档符合query
条件,则该方法返回null
。
以下方法包括用于
更新匹配文档或如果不存在匹配文档的话,创建新文档的操作选项:upsert: true
update
如果该方法找到匹配的文档,则该方法将执行更新。
如果该方法没有找到匹配的文件,该方法将创建一个新文档。由于该方法包括该sort
选项,因此它返回一个空文档作为原始(预修改)文档:{ }
如果该方法不包含sort
选项,则该方法返回
null
。
以下方法同时包含选项和
选项。该方法或者更新匹配的文档并返回更新的文档,或者,如果不存在匹配的文档,则插入文档并在字段中返回新插入的文档
。upsert: true
new:true
value
在以下示例中,people
集合中没有任何文档符合query
条件:
该方法返回新插入的文档:
通过sort
在rating
字段中包含一个规范,以下示例从people
集合中删除单个文档,该单个文档的state
值active
等于rating
匹配文档中的最低
值:
该方法返回已删除的文档:
arrayFilters
一个阵列更新操作¶注意
arrayFilters
不适用于使用聚合管道的更新。
3.6版的新功能。
从MongoDB 3.6开始,在更新数组字段时,您可以指定arrayFilters
确定要更新的数组元素。
arrayFilters
条件¶注意
arrayFilters
不适用于使用聚合管道的更新。
students
使用以下文档创建一个集合:
要修改是大于或等于所有元素100
中
grades
阵列中,使用过滤的位置操作者
$[<identifier>]
与arrayFilters
在选项
db.collection.findAndModify
方法:
该操作将更新grades
单个文档的字段,并且在操作之后,集合将包含以下文档: