Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cập nhật mảng trong MongoDB với findAndModify()

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ảng Name khớp với điều kiện query (ở đây là "Chris").
  • $inc tăng giá trị Score thêm 20.
  • findAndModify atomic – 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"}).