MongoDB - FindAndModify() 方法
findAndModify()方法修改并返回与给定条件匹配的单个文档。默认情况下,此方法返回一个修改前的文档。要返回对更新进行修改的文档,请使用新选项并将其值设置为 true。它以文档为参数。
- 如果要查找嵌入文档的字段,请使用以下语法:
“field.nestedfieldname”:
or
{field: {nestedfieldname:
- 此方法返回的文档始终包含 _id 字段。如果您不想要 _id 字段,则在投影中设置 _id:0。
- 您可以在多文档交易中使用此方法。
- 如果您在共享集合中使用此方法,则查询表达式必须包含共享键上的相等条件。
句法:
db.Collection_name.findAndModify(
{
selection_criteria:,
sort: ,
remove: ,
update: ,
new: ,
fields: ,
upsert: ,
bypassDocumentValidation: ,
writeConcern: ,
collation: ,
arrayFilters: [ , ... ]
})
参数:
- remove:如果更新字段不存在,则必须。如果为 true,则删除选定的文档。默认值为假。
- 更新:如果删除字段不存在,则必须更新。执行所选文档的更新。更新字段使用相同的更新运算符或字段:值规范来修改所选文档。
- 其他是可选的。
可选参数:
- selection_criteria:指定修改的选择标准。查询字段使用与 db.collection.find() 方法中使用的相同的查询选择器。尽管查询可能匹配多个文档,但 findAndModify() 只会选择一个文档进行修改。
- sort:确定如果查询选择多个文档,操作将修改哪个文档。 findAndModify() 将按照此参数指定的排序顺序修改第一个文档。
- new:当为真时,返回修改后的文档而不是原始文档。 findAndModify() 方法忽略删除操作的新选项。默认值为假。
- 字段:要返回的字段子集。 fields 文档指定包含一个带有 1 的字段,如下所示:
fields: { : 1, : 1, ... }
- Upsert:该参数的默认值为false。当它为真时,当没有文档与更新方法中的给定条件匹配时,它将在集合中创建一个新文档。
- writeConcern:仅在您不想使用默认写关注时使用。该参数的类型是文档。
- 排序规则:它指定使用排序规则进行操作。它允许用户为字符串比较指定特定于语言的规则,例如字母和重音标记的规则。该参数的类型是文档。
- arrayFilters:它是一个过滤器文档数组,用于指示要修改哪些数组元素以对数组字段进行更新操作。这个参数的类型是一个数组。
返回:
- 返回单个预修改文档。要返回对更新进行修改的文档,请使用新选项并将其设置为 true。
- 如果没有找到用于 upsert 的文档,这意味着该命令执行插入,并且 new 为 false,并且未指定排序选项,则该方法返回 null。
- 如果没有找到用于 upsert 的文档,这意味着该命令执行插入,并且 new 为 false,并且指定了排序选项,则该方法返回一个空文档 {}。
例子:
在以下示例中,我们正在使用:
Database: gfg
Collections: student
Document: Three documents contains name, language they use in coding and the score they got by solve problem on gfg.
- 我们将名称为 vishal 的分数增加 4:
db.student.findAndModify({query:{name:"vishal"},update:{$inc:{score:4}}})
在这里,我们使用 findAndModify() 方法增加名称为“vishal”的文档的标记字段的值。此方法返回修改前的文档
注: $inc 运算符增加分数中的值。
更新后:
- 获取修改后的文档:
db.student.findAndModify({query:{name:"vishal"},
update:{$inc:{score:4}},new:true})
在这里,我们再次将名称为“vishal”的文档的 score 字段值增加 4,但这次我们将 new 的值设置为 true,并且 findAndModify() 方法返回修改后的文档。
更新后: