Giới thiệu
findOneAndUpdate() là phương pháp cập nhật **chỉ 1 document duy nhất** khớp với filter, trả về document trước hoặc sau khi cập nhật. Khác với updateOne() chỉ trả về WriteResult.
Ví dụ minh họa
1. Tạo collection
> db.demo349.insertOne({"Name":"Chris","Marks":56});
> db.demo349.insertOne({"Name":"David","Marks":78});
> db.demo349.insertOne({"Name":"Chris","Marks":89});
> db.demo349.insertOne({"Name":"David","Marks":54});
2. Xem dữ liệu ban đầu
> db.demo349.find();
{ "_id" : ObjectId("5e55384af8647eb59e5620b4"), "Name" : "Chris", "Marks" : 56 }
{ "_id" : ObjectId("5e553853f8647eb59e5620b5"), "Name" : "David", "Marks" : 78 }
{ "_id" : ObjectId("5e55385af8647eb59e5620b6"), "Name" : "Chris", "Marks" : 89 }
{ "_id" : ObjectId("5e55385ff8647eb59e5620b7"), "Name" : "David", "Marks" : 54 }
3. Cập nhật 1 document: tăng Marks 10 cho Name="David" (document đầu tiên khớp)
> db.demo349.findOneAndUpdate(
{"Name": "David"},
{$inc: {Marks: 10}}
);
{ "_id" : ObjectId("5e553853f8647eb59e5620b5"), "Name" : "David", "Marks" : 78 }
Trả về document **TRƯỚC KHI** cập nhật (mặc định). Document đầu tiên Name="David" (_id ...38b5) có Marks 78.
4. Kiểm tra sau cập nhật
> db.demo349.find();
{ "_id" : ..., "Name" : "Chris", "Marks" : 56 }
{ "_id" : ..., "Name" : "David", "Marks" : 88 } <-- Đã cập nhật 78→88
{ "_id" : ..., "Name" : "Chris", "Marks" : 89 }
{ "_id" : ..., "Name" : "David", "Marks" : 54 }
Tùy chọn quan trọng
returnDocument: "after": Trả về document **SAU KHI** cập nhật.sort: Sắp xếp trước khi chọn document (ví dụ: sort: {_id: 1} lấy document cũ nhất).upsert: true: Tạo document mới nếu không tìm thấy khớp.projection: Chỉ trả về các trường cần thiết.
So sánh
| Phương thức | Trả về | Số document cập nhật |
|---|---|---|
| findOneAndUpdate | Document (trước/sau) | 1 |
| updateOne | WriteResult | 1 |
| updateMany | WriteResult | Nhiều |