เพิ่มคะแนนโหวตเฉพาะผู้ใช้ที่ระบุด้วย $inc
ตัวดำเนินการ $inc ใช้สำหรับเพิ่มหรือลดค่าตัวเลขของฟิลด์ได้โดยตรง เหมาะสำหรับการอัปเดตตัวนับ เช่น คะแนนโหวต จำนวนดู จำนวนไลก์ ฯลฯ
ตัวอย่างข้อมูลทดสอบ
> db.demo57.insertOne({ "Votes": { "VoterName": "Chris", "TotalVote": 50 } });
> db.demo57.insertOne({ "Votes": { "VoterName": "David", "TotalVote": 101 } });
แสดงข้อมูลก่อนอัปเดต
> db.demo57.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "Votes": { "VoterName": "Chris", "TotalVote": 50 } }
{ "_id": ObjectId("..."), "Votes": { "VoterName": "David", "TotalVote": 101 } }
คำสั่งเพิ่ม TotalVote ให้ David อีก 19 คะแนน
> db.demo57.update(
{ "Votes.VoterName": "David" },
{ $inc: { "Votes.TotalVote": 19 } }
);
ผลลัพธ์: WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
แสดงข้อมูลหลังอัปเดต
> db.demo57.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "Votes": { "VoterName": "Chris", "TotalVote": 50 } }
{ "_id": ObjectId("..."), "Votes": { "VoterName": "David", "TotalVote": 120 } }
คำอธิบาย
- { "Votes.VoterName": "David" }: ค้นหาเอกสารที่มีฟิลด์ Votes.VoterName เป็น David
- $inc: { "Votes.TotalVote": 19 }: เพิ่มค่า TotalVote ขึ้น 19 (ใช้ค่าลบเพื่อลด)
- $inc เป็นการทำงานแบบ Atomic เหมาะสำหรับการนับที่มีการอัปเดตพร้อมกันหลายครั้ง
ข้อดีของ $inc
- ไม่ต้องอ่านค่าเก้าก่อน แล้วค่อยคำนวณและเขียนใหม่ (Race condition safe)
- ทำงานได้แม้ฟิลด์ยังไม่มีอยู่ (จะสร้างฟิลด์ใหม่เริ่มจาก 0)
- รองรับตัวเลขทั้ง integer และ float