findAndModify
¶该findAndModify
命令修改并返回单个文档。默认情况下,返回的文档不包括对更新所做的修改。要返回对更新进行了修改的文档,请使用new
选项。
该命令具有以下语法:
该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 ,返回修改后的文档而不是原始文档。该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 |
整数 | 可选的。指定用于处理操作的时间限制(以毫秒为单位)。 |
findAndModify |
串 | 要针对其运行命令的集合。 |
collation |
文献 | 可选的。 指定 用于操作的排序规则。 归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 排序规则选项具有以下语法: 指定排序规则时,该 如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料 如果没有为集合或操作指定排序规则,则MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。 3.4版的新功能。 |
arrayFilters |
数组 | 可选的。筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素。 在更新文档中,使用 注意 在 您可以在更新文档中多次包含相同的标识符;但是,对于 但是,您可以在单个过滤器文档中的相同标识符上指定复合条件,例如以下示例: 有关示例,请参见使用arrayFilters进行数组更新操作。 注意
3.6版的新功能。 |
该findAndModify
命令返回包含以下字段的文档:
领域 | 类型 | 描述 |
---|---|---|
value |
文献 | 包含命令的返回值。查看值 以获取详细信息。 |
lastErrorObject |
文献 | 包含有关更新文档的信息。有关详细信息,请参见 lastErrorObject。 |
ok |
数 | 包含命令的执行状态。1 成功或0 出现错误时。 |
lastErrorObject
¶该lastErrorObject
嵌入文档包含以下字段:
领域 | 类型 | 描述 |
---|---|---|
updatedExisting |
布尔值 | 包含true 如果update 操作修改现有的文档。 |
upserted |
文献 | 如果
操作导致了新文档,则包含所插入文档的ObjectId。update upsert: true |
value
¶对于remove
操作,value
如果查询与文档匹配,则包含已删除的文档。如果查询与要删除的文档不匹配,则value
包含null
。
对于update
操作,value
嵌入式文档包含以下内容:
new
参数未设置或为false
:null
。new
是true
:upsert: true
null
。当findAndModify
命令包含选项并且查询字段未唯一索引时,在某些情况下,该命令可以多次插入文档。upsert:
true
考虑一个示例,其中不Andy
存在名称相同的文档,并且多个客户端发出以下命令:
如果所有命令query
在任何命令开始阶段之前完成了该modify
阶段,并且name
字段上没有唯一索引
,则每个命令都可能执行upsert,从而创建多个重复文档。
为防止创建多个重复的文档,请在字段上创建唯一索引name
。有了唯一索引后,多个
findAndModify
命令将表现出以下行为之一:
findAndModify
成功插入了一个新文档。findAndModify
命令将更新新插入的文档。findAndModify
命令尝试插入重复项时失败。如果命令由于唯一索引约束冲突而失败,则可以重试该命令。如果没有删除文档,重试应该不会失败。要findAndModify
在分片集合上使用,查询过滤器必须在分片键上包含相等条件。
从MongoDB 4.2开始,除非分片键字段是不可变_id
字段,否则您可以更新文档的分片键值。有关更新分片键的详细信息,请参阅“ 更改文档的分片键值”。
在MongoDB 4.2之前,文档的分片键字段值是不可变的。
该findAndModify
命令添加了对该bypassDocumentValidation
选项的支持,该
选项使您可以在使用验证规则向集合中插入或更新文档时绕过
文档验证。
update
方法的比较¶当更新一个文件,findAndModify
并且该
update()
方法不同地操作:
默认情况下,这两种操作都会修改单个文档。但是,该
update()
方法及其multi
选项可以修改多个文档。
如果多个文档符合的更新条件,则
findAndModify
可以指定sort
来提供对要更新的文档的某种控制措施。
使用该update()
方法的默认行为,当多个文档匹配时,您无法指定要更新哪个文档。
默认情况下,findAndModify
返回一个对象,该对象包含文档的预修改版本以及操作状态。要获取更新的文档,请使用new
选项。
该update()
方法返回一个
WriteResult
包含操作状态的对象。若要返回更新的文档,请使用find()
方法。但是,其他更新可能已在您的更新和文档检索之间修改了文档。另外,如果更新仅修改了一个文档,但匹配了多个文档,则您将需要使用其他逻辑来标识更新后的文档。
修改单个文档时,两者findAndModify
和
update()
方法都会自动更新文档。有关这些方法的交互作用和操作顺序的更多详细信息,请参见原子性和事务。
如果该操作导致upsert,则该集合必须已经存在。
如果在事务中运行,则不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。
重要
在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)对于您的数据和用例将继续是最佳的。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档交易的需求。
有关其他事务使用方面的注意事项(例如运行时限制和oplog大小限制),另请参见 生产注意事项。
以下命令更新people
集合中符合query
条件的现有文档:
该命令执行以下操作:
在query
找到的文件people
,其中收集
name
字段的值Tom
,该state
字段值active
和rating
字段的值
10。greater than
该sort
订单升序排序查询的结果。如果满足多个文档的query
条件,该命令将按this的顺序选择第一个文档进行修改
sort
。
在update
increments
所述的的值
score
由1场。
该命令返回包含以下字段的文档:
的lastErrorObject
包含命令的细节,包括字段字段updatedExisting
是
true
和
该value
包含选择用于该更新的原始(即,预变形例)文档字段:
要在value
字段中返回修改后的文档,请将new:true
选项添加
到命令中。
如果没有文档符合query
条件,则该命令将返回包含null
在value
字段中的文档:
在mongo
外壳和许多司机
提供findAndModify()
帮助的方法。使用shell帮助器,此先前的操作可以采用以下形式:
但是,findAndModify()
shell帮助器方法仅返回未修改的文档,如果new
是
true
,则返回已修改的文档。
upsert: true
¶以下findAndModify
命令包含用于更新匹配文档或如果不存在匹配文档,则创建新文档的操作选项:upsert:
true
update
如果该命令找到匹配的文档,则该命令将执行更新。
如果该命令没有找到匹配的文件,update
与UPSERT:真正的操作导致的插入,并返回一个文档具有以下字段:
lastErrorObject
包含命令的细节,包括字段字段upserted
包含
_id
新插入的文档的值,和value
包含的字段null
。以下findAndModify
命令同时包含
option和option。该命令或者更新匹配的文档并返回更新的文档,或者,如果不存在匹配的文档,则插入文档并在字段中返回新插入的文档。upsert: true
new:true
value
在以下示例中,people
集合中没有任何文档符合query
条件:
该命令将在value
字段中返回新插入的文档:
通过sort
在rating
字段中包含一个规范,以下示例从people
集合中删除单个文档,该单个文档的state
值active
等于rating
匹配文档中的最低
值:
该命令返回已删除的文档: