📅  最后修改于: 2023-12-03 15:17:41.451000             🧑  作者: Mango
MongoDB 中的 findAndModify()
方法可用于在修改文档的同时返回修改前的文档或者查询并删除文档。
db.collection.findAndModify({
query: <document>,
[sort: <document>],
[remove: <boolean>],
[update: <document>],
[new: <boolean>],
[fields: <document>],
[upsert: <boolean>]
})
query
:需要查询的文档;sort
:用于对查询结果进行排序的规则;remove
:是否删除找到的文档,默认为 false
;update
:用于进行更新的规则;new
:返回修改后的文档。默认为 false
,表示返回修改前的文档;fields
:指定需返回的字段;upsert
:如果不存在则插入文档。默认为 false
,表示不插入新文档。findAndModify()
方法会返回修改前的文档或者被删除的文档(仅在 remove
参数为 true
时生效)。
我们有一个集合 users
:
> db.users.find()
{ "_id" : ObjectId("60a968db3f6e637eba5ffe9c"), "name" : "Alice", "age" : 25, "country" : "America" }
{ "_id" : ObjectId("60a969283f6e637eba5ffe9d"), "name" : "Bob", "age" : 28, "country" : "Canada" }
{ "_id" : ObjectId("60a9694f3f6e637eba5ffe9e"), "name" : "Charlie", "age" : 30, "country" : "China" }
现在,我们需要将 Alice 的年龄修改为 26,并返回修改前的文档:
const result = db.users.findAndModify({
query: { name: 'Alice' },
update: { $set: { age: 26 } },
new: true
})
返回值 result
为:
{
"_id" : ObjectId("60a968db3f6e637eba5ffe9c"),
"name" : "Alice",
"age" : 25,
"country" : "America"
}
因为我们设置了 new: true
,所以返回了修改后的文档。
现在,集合 users
的内容为:
> db.users.find()
{ "_id" : ObjectId("60a968db3f6e637eba5ffe9c"), "name" : "Alice", "age" : 26, "country" : "America" }
{ "_id" : ObjectId("60a969283f6e637eba5ffe9d"), "name" : "Bob", "age" : 28, "country" : "Canada" }
{ "_id" : ObjectId("60a9694f3f6e637eba5ffe9e"), "name" : "Charlie", "age" : 30, "country" : "China" }
现在我们需要查询年龄小于 30 的用户中年龄最小的一个,并将其删除:
const result = db.users.findAndModify({
query: { age: { $lt: 30 } },
sort: { age: 1 },
remove: true
})
返回值 result
为:
{
"_id" : ObjectId("60a968db3f6e637eba5ffe9c"),
"name" : "Alice",
"age" : 26,
"country" : "America"
}
因为我们设置了 remove: true
,所以返回了被删除的文档。
现在,集合 users
的内容为:
{ "_id" : ObjectId("60a969283f6e637eba5ffe9d"), "name" : "Bob", "age" : 28, "country" : "Canada" }
{ "_id" : ObjectId("60a9694f3f6e637eba5ffe9e"), "name" : "Charlie", "age" : 30, "country" : "China" }