Phương thức findAndModify() (hoặc findOneAndUpdate() hiện đại) thực hiện tìm kiếm và cập nhật atomic trong một thao tác, trả về tài liệu trước hoặc sau khi cập nhật. Rất hữu ích khi cập nhật mảng dựa trên điều kiện phức tạp.
Dữ liệu mẫu
> db.demo152.insertOne({"id":102,"Name":["Chris","David"],Score:45});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3515bcfdf09dd6d08539dd") }
> db.demo152.insertOne({"id":103,"Name":["Mike","Carol"],Score:65});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3515cafdf09dd6d08539de") }
Xem dữ liệu
> db.demo152.find();
{ "_id" : ObjectId("5e3515bcfdf09dd6d08539dd"), "id" : 102, "Name" : [ "Chris", "David" ], "Score" : 45 }
{ "_id" : ObjectId("5e3515cafdf09dd6d08539de"), "id" : 103, "Name" : [ "Mike", "Carol" ], "Score" : 65 }
Cập nhật: Tìm id=102, Score<50, Name="Chris" -> đổi Chris thành Robert, tăng Score 20
> var d = db.demo152.findAndModify({
... query: { id:102, Score: {$lt:50}, Name: "Chris" },
... update: { $set : {"Name.$": "Robert"}, $inc: {Score: 20 } }
... })
Kết quả sau cập nhật
> db.demo152.find();
{ "_id" : ObjectId("5e3515bcfdf09dd6d08539dd"), "id" : 102, "Name" : [ "Robert", "David" ], "Score" : 65 }
{ "_id" : ObjectId("5e3515cafdf09dd6d08539de"), "id" : 103, "Name" : [ "Mike", "Carol" ], "Score" : 65 }
Giải thích:
Name.$là positional operator – chỉ cập nhật phần tử đầu tiên trong mảngNamekhớp với điều kiện query (ở đây là "Chris").$inctăng giá trịScorethêm 20.findAndModifyatomic – không có race condition giữa tìm và cập nhật.- Phiên bản mới: dùng
findOneAndUpdate({...}, {...}, {returnDocument: "after"}).