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

การคัดลอกค่าฟิลด์หนึ่งไปยังอีกฟิลด์ใน MongoDB ด้วย $set และ forEach

คัดลอกค่าระหว่างฟิลด์ในเอกสารเดียวกัน

เมื่อต้องการคัดลอกค่าจากฟิลด์หนึ่งไปยังอีกฟิลด์หนึ่งในทุกเอกสาร สามารถใช้ 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