คัดลอกค่าระหว่างฟิลด์ในเอกสารเดียวกัน
เมื่อต้องการคัดลอกค่าจากฟิลด์หนึ่งไปยังอีกฟิลด์หนึ่งในทุกเอกสาร สามารถใช้ forEach() ร่วมกับ update() และ $set ได้
ตัวอย่างข้อมูลทดสอบ
> db.demo55.insertOne({ "ShippingDate": "", "date": new ISODate("2019-01-21") });
> db.demo55.insertOne({ "ShippingDate": "", "date": new ISODate("2020-05-12") });
แสดงข้อมูลก่อนคัดลอก
> db.demo55.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "ShippingDate": "", "date": ISODate("2019-01-21T00:00:00Z") }
{ "_id": ObjectId("..."), "ShippingDate": "", "date": ISODate("2020-05-12T00:00:00Z") }
คำสั่งคัดลอกค่า date ไปยัง ShippingDate
> db.demo55.find({}).forEach(function(c) {
db.demo55.update({ _id: c._id }, { $set: { ShippingDate: c.date } });
});
แสดงข้อมูลหลังคัดลอก
> db.demo55.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "ShippingDate": ISODate("2019-01-21T00:00:00Z"), "date": ISODate("2019-01-21T00:00:00Z") }
{ "_id": ObjectId("..."), "ShippingDate": ISODate("2020-05-12T00:00:00Z"), "date": ISODate("2020-05-12T00:00:00Z") }
วิธีที่ทันสมัยและมีประสิทธิภาพกว่า (MongoDB 4.2+)
ใช้ updateMany() พร้อม Aggregation Pipeline:
> db.demo55.updateMany(
{},
[{ $set: { ShippingDate: "$date" } }]
);
ข้อดีของวิธี Pipeline
- ทำงานฝั่ง Server (Server-side) ไม่ต้องส่งข้อมูลไปมาระหว่าง Client-Server
- Atomic ต่อเอกสาร
- เร็วกว่ามากสำหรับข้อมูลจำนวนมาก
- รองรับการใช้ expression ทั้งหมดของ Aggregation