📅  最后修改于: 2023-12-03 15:03:01.533000             🧑  作者: Mango
在MongoDB中,使用db.collection.findOneAndUpdate()
方法可以原子性地更新一个文档,并且返回更新前的文档。本文将介绍该方法的用法及示例。
db.collection.findOneAndUpdate(query, update, options)
参数说明:
query
: 更新的查询条件,与db.collection.find()
方法中的参数相同。update
: 需要更新的文档,可以使用操作符如$set
、$inc
等。options
: 可选,一些更新选项,如upsert
、returnOriginal
等。假设有一个集合名为users
,包含以下文档:
{ "_id" : ObjectId("60aeb6fa75082b406c305d21"), "name" : "Tom", "age" : 20 }
{ "_id" : ObjectId("60aeb6fa75082b406c305d22"), "name" : "Jerry", "age" : 25 }
{ "_id" : ObjectId("60aeb6fa75082b406c305d23"), "name" : "Alice", "age" : 30 }
现在我们需要更新name
为Tom
的文档的age
字段为22
,并返回更新前的文档。
示例代码如下:
const MongoClient = require('mongodb').MongoClient;
const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect(err => {
const collection = client.db('test').collection('users');
const query = { name: 'Tom' };
const update = { $set: { age: 22 } };
const options = { returnOriginal: false };
collection.findOneAndUpdate(query, update, options, function(err, result) {
console.log(result.value);
// { "_id" : ObjectId("60aeb6fa75082b406c305d21"), "name" : "Tom", "age" : 20 }
});
client.close();
});
该方法返回更新前的文档,可以通过result.value
得到。
db.collection.findOneAndUpdate()
方法的选项如下:
projection
: 可选,控制文档的返回字段。与db.collection.find()
方法中的参数相同。upsert
: 可选,表示如果不存在符合条件的文档时是否插入一个新文档。示例代码:
const query = { name: 'Mike' };
const update = { $set: { age: 30 } };
const options = { upsert: true };
collection.findOneAndUpdate(query, update, options, function(err, result) {
console.log(result.value);
// null
});
const query2 = { name: 'Mike' };
const update2 = { $set: { age: 30 } };
const options2 = { upsert: true, returnOriginal: false };
collection.findOneAndUpdate(query2, update2, options2, function(err, result) {
console.log(result.value);
// { "_id" : ObjectId("60aeb6fa75082b406c305d24"), "name" : "Mike", "age" : 30 }
});
以上代码中,第一个示例使用了upsert
选项,但由于不存在符合条件的文档,故返回null
。第二个示例使用了upsert
选项,成功地插入了一个新文档,并返回新文档。
db.collection.findOneAndUpdate()
方法是MongoDB提供的一个十分便捷的更新文档的方式,通过该方法,我们可以原子性地更新一个文档,并返回更新前的文档。该方法有很多选项可以供我们使用,如projection
、upsert
等,可以根据需要进行设置。