คัดลอกเอกสารระหว่าง Collections ด้วย $out ใน Aggregation
บทความนี้สาธิตวิธีการคัดลอกข้อมูลจาก Collection เดิมไปสร้าง Collection ใหม่ โดยใช้ Aggregation Pipeline พร้อม Stage $out และ $sample สำหรับสุ่มข้อมูล (ถ้าต้องการ)
ขั้นตอนที่ 1: สร้าง Collection ต้นทาง (sourceCollection)
> db.sourceCollection.insertOne({"EmployeeName":"Robert","EmployeeSalary":15000});
{ "acknowledged": true, "insertedId": ObjectId("5e0397c1f5e889d7a5199506") }
> db.sourceCollection.insertOne({"EmployeeName":"David","EmployeeSalary":25000});
{ "acknowledged": true, "insertedId": ObjectId("5e0397c3f5e889d7a5199507") }
> db.sourceCollection.insertOne({"EmployeeName":"Mike","EmployeeSalary":29000});
{ "acknowledged": true, "insertedId": ObjectId("5e0397c4f5e889d7a5199508") }
ขั้นตอนที่ 2: สร้าง Collection ปลายทาง (destinationCollection)
> db.createCollection('destinationCollection');
{ "ok": 1 }
ขั้นตอนที่ 3: ใช้ Aggregate + $out เพื่อคัดลอก
$sample: { size: 333333 } ใช้สุ่มเอกสาร (ขนาดใหญ่กว่าจำนวนจริง = เอาทั้งหมด แบบสุ่มลำดับ)
$out: "destinationCollection" เขียนผลลัพธ์ไปยัง Collection ใหม่ (จะสร้างใหม่ถ้ายังไม่มี)
allowDiskUse: true อนุญาตใช้ Disk ชั่วคราวสำหรับข้อมูลใหญ่
> db.sourceCollection.aggregate([
{ $sample: { size: 333333 }},
{ $out: "destinationCollection" }
], { allowDiskUse: true });
ขั้นตอนที่ 4: ตรวจสอบข้อมูลใน Collection ใหม่
> db.destinationCollection.find().pretty()
ผลลัพธ์: ข้อมูลถูกคัดลอกครบ (ลำดับอาจสุ่ม)
{ "_id": ObjectId("5e0397c4f5e889d7a5199508"), "EmployeeName": "Mike", "EmployeeSalary": 29000 }
{ "_id": ObjectId("5e0397c3f5e889d7a5199507"), "EmployeeName": "David", "EmployeeSalary": 25000 }
{ "_id": ObjectId("5e0397c1f5e889d7a5199506"), "EmployeeName": "Robert", "EmployeeSalary": 15000 }
สรุป: $out ใน Aggregation Pipeline เป็นวิธีที่มีประสิทธิภาพสำหรับคัดลอก/ย้ายข้อมูลระหว่าง Collections ภายใน Database เดียวกัน รองรับการ Transform ข้อมูลระหว่างทางได้