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

การ Upsert หลายเอกสารใน MongoDB ด้วย Bulk Operations

ใช้ 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() ในเวอร์ชันใหม่