Để cập nhật một trường số (tăng/giảm) trong object lồng nhau (nested object) mà không ảnh hưởng các trường khác, MongoDB cung cấp toán tử $inc (increment). Toán tử này tự động cộng giá trị vào trường hiện tại (hoặc tạo mới nếu chưa có).
1. Tạo bộ sưu tập voting
> db.demo57.insertOne({ "Votes": { "VoterName": "Chris", "TotalVote": 50 } });
> db.demo57.insertOne({ "Votes": { "VoterName": "David", "TotalVote": 101 } });
2. Xem dữ liệu ban đầu
> db.demo57.find();
Kết quả:
{ "_id": ObjectId("..."), "Votes": { "VoterName": "Chris", "TotalVote": 50 } }
{ "_id": ObjectId("..."), "Votes": { "VoterName": "David", "TotalVote": 101 } }
3. Tăng TotalVote của David thêm 19 (từ 101 lên 120)
> db.demo57.update(
{ "Votes.VoterName": "David" },
{ $inc: { "Votes.TotalVote": 19 } }
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
Giải thích:
- Filter
{ "Votes.VoterName": "David" }tìm tài liệu có voter tên David. $inctăng trườngVotes.TotalVotethêm 19 đơn vị.
4. Kết quả
> db.demo57.find();
Kết quả:
{ "_id": ObjectId("..."), "Votes": { "VoterName": "Chris", "TotalVote": 50 } }
{ "_id": ObjectId("..."), "Votes": { "VoterName": "David", "TotalVote": 120 } }
Ứng dụng: Rất phù hợp cho hệ thống vote, like, counter, inventory (tăng/giảm số lượng) - atomic operation, tránh race condition.