Để tăng giá trị của một trường trong phần tử mảng object, dùng update() với toán tử $inc và positional operator $.
Dữ liệu mẫu
> db.demo97.insertOne({
... "Details": [
... { "Name": "Chris", "Marks": 45 },
... { "Name": "Bob", "Marks": 88 }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2d6d24b8903cdd865577af") }
Truy vấn tăng Marks 10 cho Bob
> db.demo97.update(
... { "Details.Name": "Bob" },
... { $inc: { "Details.$.Marks" : 10 } }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kết quả
{ "_id" : ObjectId("5e2d6d24b8903cdd865577af"), "Details" : [ { "Name" : "Chris", "Marks" : 45 }, { "Name" : "Bob", "Marks" : 98 } ] }
Giải thích:
{ "Details.Name": "Bob" }: Tìm document có phần tử Name="Bob" trong mảng DetailsDetails.$.Marks: Toán tử$trỏ đến phần tử đầu tiên khớp trong mảng$inc: Tăng giá trị số (cũng dùng cho giảm với số âm)
Lưu ý: Chỉ cập nhật phần tử đầu tiên khớp. Nếu cần cập nhật nhiều phần tử khớp, dùng arrayFilters (MongoDB 3.6+) hoặc $[ filtered positional operator.