db.collection.
findAndModify
(文件)new
选项。 findAndModify()方法是findAndModify命令周围的 shell 助手。query
query
字段使用与db.collection.find()方法中使用的query selectors相同的query selectors。虽然查询可能匹配多个文档,但findAndModify() 只会选择一个文档来修改。 如果未指定,则默认为空文档。 从 MongoDB 3.6.14(和 3.4.23)开始,如果查询参数不是文档,则操作错误。sort
remove
remove
或update
字段。删除query
字段中指定的文档。将其设置为true
以删除所选文档。默认值为false
。update
remove
或update
字段。执行所选文档的更新。 update
字段使用相同的更新 operators或field: value
规范来修改所选文档。new
true
时,返回修改后的文档而不是原始文档。 findAndModify()方法忽略remove
操作的new
选项。默认值为false
。fields
fields
文档指定包含1
的字段,如:fields: { <field1>: 1, <field2>: 1, ... }
。见投影。 从 MongoDB 3.6.14(和 3.4.23)开始,如果 fields 参数不是文档,则操作错误。upsert
update
字段结合使用。 当true
,findAndModify()时: 如果没有文件匹配query
,则创建一个新文档。有关详细信息,请参阅upsert 行为。 更新与query
匹配的单个文档。 要避免多次 upsert,请确保query
字段为唯一索引。 默认为false
。bypassDocumentValidation
writeConcern
maxTimeMS
collation
locale
字段是必填字段;所有其他校对字段都是可选的。有关字段的说明,请参阅整理文件。 如果未指定排序规则但集合具有默认排序规则(请参阅db.createCollection()),则操作将使用为集合指定的排序规则。 如果没有为集合或操作指定排序规则,MongoDB 使用先前版本中用于 string 比较的简单二进制比较。 您无法为操作指定多个排序规则。对于 example,您不能为每个字段指定不同的排序规则,或者如果使用排序执行查找,则不能对查找使用一个排序规则,而对排序使用另一个排序规则。 version 3.4 中的新内容。arrayFilters
<identifier>
必须以小写字母开头,并且只包含字母数字字符。 您可以在更新文档中多次包含相同的标识符;但是,对于更新文档中的每个不同标识符($[identifier]
),您必须指定恰好一个对应的 array 过滤器文档。也就是说,您不能为同一标识符指定多个 array 过滤器文档。对于 example,如果 update 语句包含标识符x
(可能多次),则不能为arrayFilters
指定以下内容,其中包含 2 个单独的x
过滤器文档: [ { "x.a": { $gt: 85 } }, { "x.b": { $gt: 80 } } ] 但是,您可以在同一标识符上指定复合条件单个过滤器文档,例如以下示例: // Example 1 [ { $or: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] } ] // Example 2 [ { $and: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] } ] // Example 3 [ { "x.a": { $gt: 85 }, "x.b": { $gt: 80 } } ] 例如,请参阅为 Array Update Operations 指定 arrayFilters。 version 3.6 中的新内容。null
。new
参数或false
:null
。new
是true
:upsert: true
,没有文档与查询匹配;null
。sort
已指定,upsert: true
,new
选项未设置或new: false
,db.collection.findAndModify()将返回空文档{}
而不是null
。upsert: true
选项并且查询 field(s)没有唯一索引时,该方法可以在某些情况下多次插入文档。Andy
的文档,并且多个 clients 发出以下命令:modify
阶段之前完成query
阶段,和在name
字段上没有唯一索引,则命令可以全部执行 upsert,创建多个重复文档。name
字段上创建独特的指数。有了这个唯一索引,多个方法将表现出以下行为之一:name
字段上的唯一索引约束违规而导致方法失败,则可以重试该方法。如果没有删除文档,则重试不应失败。query
必须包含针对分片集合的分片 cluster 的所有操作的碎片 key。findAndModify
针对_非分片_集合的mongos
实例发出的操作正常运行。_id
字段。有关更新分片键的详细信息,请参见更改文档的分片键值。bypassDocumentValidation
选项的支持,该选项允许您在使用验证规则插入或更新集合中的文档时绕过文件验证。multi
选项的update()方法可以修改多个文档。sort
以提供对要更新的文档的某种控制措施。new
选项。db.collection.findAndModify()
可以在多文档交易中使用。重要在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应替代有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)将继续是您的数据和用例的最佳选择。也就是说,在许多情况下,适当地对数据建模将最大程度地减少对多文档交易的需求。有关其他事务使用方面的注意事项(例如运行时限制和操作日志大小限制),另请参见 生产注意事项。
db.collection.findAndModify()
导致upsert,则该集合必须已经存在。query
在people
集合中查找name
字段具有 value Tom
,state
字段具有 value active
且rating
字段具有 value greater than
10 的文档。sort
以升序 order 命令查询结果。如果多个文档符合query
条件,则该方法将选择修改此sort
所订购的第一个文档。increments
score
字段的 value 为 1。new:true
选项添加到方法中。query
条件匹配,则该方法返回null
。update
选项的upsert: true
选项,用于更新匹配的文档;如果不存在匹配的文档,则创建新文档:sort
选项,所以它返回一个空文档{ }
作为原始(pre-modification)文档:sort
选项,则该方法返回null
。upsert: true
选项和new:true
选项。该方法更新匹配的文档并返回更新的文档,或者,如果不存在匹配的文档,则插入文档并在value
字段中返回新插入的文档。people
集合中的任何文档都不匹配query
条件:rating
字段上包含sort
规范,以下 example 将从people
集合中删除state
value 为active
且匹配文档中最低rating
的单个文档:myColl
具有以下文档:注意arrayFilters
不适用于使用聚合管道的更新。
arrayFilters
来确定要更新的 array 元素。students
:grades
array 中大于或等于100
的所有元素,请使用过滤后的位置 operator $ [<identifier> ]和db.collection.findAndModify方法中的arrayFilters
选项:grades
字段,在操作之后,该集合具有以下文档:students2
:grades
array 中等级大于或等于85
的所有元素的mean
字段的 value,请使用过滤后的位置 operator $ [<identifier> ]和db.collection.findAndModify方法中的arrayFilters
:grades
字段,在操作之后,该集合具有以下文档:db.collection.findAndModify()
可以接受聚合管道进行更新。管道可以包括以下阶段:$addFields
及其别名 $set
$project
及其别名 $unset
$replaceRoot
及其别名$replaceWith
。students2
使用以下文档创建一个集合:_id
字段等于 的文档,1
并使用聚合管道total
从该grades
字段中计算一个新 字段:注意$set管道中的使用是指聚集阶段 $set,而不是更新操作$set。
也可以看看可线性化通过 findAndModify 读取