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

Cập nhật chỉ một trường (TotalVote) trong bản ghi voting MongoDB

Để 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.
  • $inc tăng trường Votes.TotalVote thê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.