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

การคัดลอกค่าจากฟิลด์หนึ่งไปยังอีกฟิลด์หนึ่งใน MongoDB

อัปเดตค่าฟิลด์จากฟิลด์อื่นในเอกสารเดียวกันด้วย 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 และเร็วกว่ามากสำหรับข้อมูลจำนวนมาก