อัปเดตค่าฟิลด์จากฟิลด์อื่นในเอกสารเดียวกันด้วย forEach()
เมื่อต้องการคัดลอกค่าจากฟิลด์หนึ่งไปยังอีกฟิลด์หนึ่งในทุกเอกสาร สามารถใช้ forEach() ร่วมกับ save() หรือ updateOne() ได้
ตัวอย่างข้อมูลทดสอบ
> db.demo51.insert({ "Name1": "Chris", "Name": "David", "Age": 24 });
> db.demo51.insert({ "Name1": "Carol", "Name": "Mike", "Age": 22 });
> db.demo51.insert({ "Name1": "Sam", "Name": "Bob", "Age": 26 });
แสดงข้อมูลก่อนอัปเดต
> db.demo51.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "Name1": "Chris", "Name": "David", "Age": 24 }
{ "_id": ObjectId("..."), "Name1": "Carol", "Name": "Mike", "Age": 22 }
{ "_id": ObjectId("..."), "Name1": "Sam", "Name": "Bob", "Age": 26 }
คำสั่งคัดลอกค่า Name ไปยัง Name1
> db.demo51.find().forEach(function(d) {
d.Name1 = d.Name;
db.demo51.save(d);
});
แสดงข้อมูลหลังอัปเดต
> db.demo51.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "Name1": "David", "Name": "David", "Age": 24 }
{ "_id": ObjectId("..."), "Name1": "Mike", "Name": "Mike", "Age": 22 }
{ "_id": ObjectId("..."), "Name1": "Bob", "Name": "Bob", "Age": 26 }
วิธีที่แนะนำในปัจจุบัน (MongoDB 4.2+)
ควรใช้ updateMany() พร้อม $set และ aggregation pipeline แทน forEach เพื่อประสิทธิภาพที่ดีกว่า:
> db.demo51.updateMany(
{},
[{ $set: { Name1: "$Name" } }]
);
วิธีนี้ทำงานแบบ atomic และเร็วกว่ามากสำหรับข้อมูลจำนวนมาก