สลับค่า Boolean Field (True ↔ False) ใน MongoDB
MongoDB ไม่มีคำสั่ง Toggle ตรงตัว แต่สามารถทำได้โดย: 1) อ่านค่าปัจจุบัน 2) คำนวณค่าใหม่ 3) อัปเดทด้วย $set
ตัวอย่างข้อมูล
> db.toggleDemo.insertOne({"CustomerName":"John Smith","CustomerAge":28,"isMarried":true});
> db.toggleDemo.insertOne({"CustomerName":"David Miller","CustomerAge":25,"isMarried":false});
ขั้นตอน Toggle สำหรับ David Miller
> var value = db.toggleDemo.findOne({CustomerName:"David Miller"});
> db.toggleDemo.update(
{CustomerName:"David Miller"},
{$set: {isMarried: !value.isMarried}}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ผลลัพธ์: isMarried กลายเป็น true
> db.toggleDemo.find().pretty();
{ "_id" : ObjectId("5cc7be138f9e6ff3eb0ce43b"), "CustomerName" : "John Smith", "CustomerAge" : 28, "isMarried" : true }
{ "_id" : ObjectId("5cc7be2e8f9e6ff3eb0ce43c"), "CustomerName" : "David Miller", "CustomerAge" : 25, "isMarried" : true }
วิธีทำแบบ Atomic (Single Operation) - MongoDB 4.2+
ใช้ updateOne() ร่วมกับ Pipeline และ $not:
db.toggleDemo.updateOne(
{ CustomerName: "David Miller" },
[{ $set: { isMarried: { $not: "$isMarried" } } }]
);
ประโยชน์ของวิธี Pipeline
- Atomic: อ่านและเขียนใน Operation เดียวกัน ไม่มี Race Condition
- ไม่ต้อง Query หาค่าก่อน
- รองรับใน
updateOne,updateMany,findOneAndUpdate
สรุป
- วิธีเก่า: Find → Toggle ใน Client → Update (2 Round-trips)
- วิธีใหม่ (4.2+): Update with Aggregation Pipeline (1 Round-trip, Atomic)
- เหมาะสำหรับ Feature Flags, On/Off Settings, Status Toggling