Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

การอัปเดตเฉพาะฟิลด์ TotalVote ในเอกสารโหวต MongoDB ด้วย $inc

เพิ่มคะแนนโหวตเฉพาะผู้ใช้ที่ระบุด้วย $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