ใช้ initializeUnorderedBulkOp() สำหรับ Upsert หลายเอกสาร
ใน MongoDB เวอร์ชันเก่า (ก่อน 3.2) ใช้ Bulk Operations API ผ่าน initializeUnorderedBulkOp() หรือ initializeOrderedBulkOp() สำหรับการเขียนหลายรายการพร้อมกัน รวมถึง Upsert
ตัวอย่างข้อมูลทดสอบ
> db.demo425.insertOne({ "Name": "Chris", "Age": 21 });
> db.demo425.insertOne({ "Name": "David", "Age": 23 });
> db.demo425.insertOne({ "Name": "Chris", "Age": 21 });
> db.demo425.insertOne({ "Name": "Chris", "Age": 21 });
แสดงข้อมูลก่อน
> db.demo425.find();
ผลลัพธ์: 4 เอกสาร (Chris 3 คน, David 1 คน)
คำสั่ง Bulk Upsert: อัปเดต Name="Chris" ทุกคนเป็น Robert Age 23
> var b1 = db.demo425.initializeUnorderedBulkOp();
> b1.find({ Name: "Chris" }).upsert().update({
$setOnInsert: { id: 101 },
$set: { Name: "Robert", Age: 23 }
});
> b1.execute();
ผลลัพธ์: BulkWriteResult({ "nMatched": 3, "nModified": 3, "nUpserted": 0, ... })
แสดงข้อมูลหลัง Bulk Upsert
> db.demo425.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "Name": "Robert", "Age": 23 }
{ "_id": ObjectId("..."), "Name": "David", "Age": 23 }
{ "_id": ObjectId("..."), "Name": "Robert", "Age": 23 }
{ "_id": ObjectId("..."), "Name": "Robert", "Age": 23 }
คำอธิบาย
- initializeUnorderedBulkOp(): สร้าง Bulk Operation แบบไม่เรียงลำดับ (เร็วกว่า)
- find({ Name: "Chris" }): เงื่อนไขค้นหา
- .upsert(): เปิดโหมด Upsert (แทรกถ้าไม่เจอ)
- .update({ $setOnInsert: { id: 101 }, $set: { Name: "Robert", Age: 23 } }):
- $setOnInsert: ตั้งค่าเฉพาะตอน Insert ใหม่ (id: 101)
- $set: ตั้งค่าทุกครั้ง (ทั้ง Update และ Insert)
- ในที่นี้ match 3 เอกสาร Chris -> อัปเดตทั้ง 3 ตัว (nUpserted: 0)
รูปแบบใหม่ (MongoDB 3.2+): ใช้ bulkWrite()
> db.demo425.bulkWrite([
{
updateMany: {
filter: { Name: "Chris" },
update: { $set: { Name: "Robert", Age: 23 } }
}
}
]);
bulkWrite() ทดแทน Bulk Operations API เดิม ใช้ง่ายกว่า รองรับ ordered/unordered และคืนค่าผลลัพธ์ที่อ่านง่ายกว่า
สรุป
- Bulk Operations เหมาะสำหรับ Import/Export ข้อมูลจำนวนมาก
- Upsert ใน Bulk: ใช้ $setOnInsert สำหรับฟิลด์ที่ตั้งค่าตอน Insert เท่านั้น
- ควรใช้ bulkWrite() แทน initializeUnorderedBulkOp() ในเวอร์ชันใหม่