📌  相关文章
📜  MongoDB – db.collection.findOneAndUpdate() 方法(1)

📅  最后修改于: 2023-12-03 15:03:01.533000             🧑  作者: Mango

MongoDB – db.collection.findOneAndUpdate() 方法

在MongoDB中,使用db.collection.findOneAndUpdate()方法可以原子性地更新一个文档,并且返回更新前的文档。本文将介绍该方法的用法及示例。

语法格式

db.collection.findOneAndUpdate(query, update, options)

参数说明:

  • query: 更新的查询条件,与db.collection.find()方法中的参数相同。
  • update: 需要更新的文档,可以使用操作符如$set$inc等。
  • options: 可选,一些更新选项,如upsertreturnOriginal等。
示例

假设有一个集合名为users,包含以下文档:

{ "_id" : ObjectId("60aeb6fa75082b406c305d21"), "name" : "Tom", "age" : 20 }
{ "_id" : ObjectId("60aeb6fa75082b406c305d22"), "name" : "Jerry", "age" : 25 }
{ "_id" : ObjectId("60aeb6fa75082b406c305d23"), "name" : "Alice", "age" : 30 }

现在我们需要更新nameTom的文档的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提供的一个十分便捷的更新文档的方式,通过该方法,我们可以原子性地更新一个文档,并返回更新前的文档。该方法有很多选项可以供我们使用,如projectionupsert等,可以根据需要进行设置。