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

วิธีใช้ save() ให้ถูกต้องใน MongoDB


db.collection.save() - Upsert แบบอัตโนมัติ

เมธอด save() จะทำการ insert ใหม่ หากเอกสารไม่มี _id หรือ _id ไม่มีในระบบ และ update (replace) หาก _id มีอยู่แล้ว

ตัวอย่างการใช้งาน

> db.demo481.save({ "FirstName": "Chris", "LastName": "Brown" });
WriteResult({ "nInserted": 1 })
> db.demo481.save({ "FirstName": "David", "LastName": "Miller" });
WriteResult({ "nInserted": 1 })
> db.demo481.save({ "FirstName": "John", "LastName": "Doe" });
WriteResult({ "nInserted": 1 })
> db.demo481.save({ "FirstName": "John", "LastName": "Smith" });
WriteResult({ "nInserted": 1 })

แสดงผลลัพธ์

> db.demo481.find();
{ "_id": ObjectId(...), "FirstName": "Chris", "LastName": "Brown" }
{ "_id": ObjectId(...), "FirstName": "David", "LastName": "Miller" }
{ "_id": ObjectId(...), "FirstName": "John", "LastName": "Doe" }
{ "_id": ObjectId(...), "FirstName": "John", "LastName": "Smith" }

การทำงานของ save()

ตัวอย่าง Update ด้วย save()

> var doc = db.demo481.findOne({ "FirstName": "Chris" });
> doc.LastName = "Johnson";
> db.demo481.save(doc);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })

ข้อควรระวัง

  • Replace ทั้งเอกสาร - save() แทนที่เอกสารทั้งหมด ไม่ใช่ $set ฟิลด์เดียว
  • Deprecated - ใน MongoDB 4.2+ แนะนำให้ใช้ insertOne(), replaceOne(), updateOne() แทน
  • Race condition - fetch-modify-save ไม่ใช่ atomic

แนวทางแทนที่ (Recommended)

// Insert ใหม่
db.demo481.insertOne({ "FirstName": "Chris", "LastName": "Brown" });

// Replace ทั้งเอกสาร (ต้องมี _id)
db.demo481.replaceOne({ _id: doc._id }, { "FirstName": "Chris", "LastName": "Johnson" });

// Update เฉพาะฟิลด์
db.demo481.updateOne({ _id: doc._id }, { $set: { "LastName": "Johnson" } });
สถานการณ์พฤติกรรม
เอกสารไม่มี _idInsert ใหม่ สร้าง _id อัตโนมัติ
เอกสารมี _id ที่ไม่มีในระบบInsert ใหม่ ใช้ _id ที่ระบุ
เอกสารมี _id ที่มีอยู่แล้วReplace ทั้งเอกสาร (เหมือน replaceOne)