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

อัปเดท Element ในอาร์เรย์ MongoDB

ใช้ $addToSet เพิ่ม Element ใน Array (ป้องกัน Duplicate)

โอเปอเรเตอร์ $addToSet เพิ่มค่าเข้า Array ก็ต่อเมื่อค่านั้น ยังไม่มีอยู่ (Unique) ร่วมกับ Positional Operator $ เพื่อระบุ Array Element ที่จะ Update

ตัวอย่างข้อมูล: Client Details มี DeveloperDetails เป็น Array ว่าง

> db.updateArrayDemo.insertOne({
    "ClientDetails": [
        { "ClientName": "John", "DeveloperDetails": [] },
        { "ClientName": "Larry", "DeveloperDetails": [] }
    ]
});

คำสั่ง: เพิ่ม Technology Object ให้ Larry (ClientDetails Element ที่ ClientName=Larry)

> db.updateArrayDemo.update(
    { "ClientDetails.ClientName": "Larry" },
    { $addToSet: { "ClientDetails.$.Technology": { 'DeveloperName': "Chris", 'WorkExperience': 5 } } },
    false,  // upsert
    true    // multi
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

ผลลัพธ์: Larry มี Technology Array ใหม่

> db.updateArrayDemo.find().pretty();
{
    "ClientDetails" : [
        { "ClientName" : "John", "DeveloperDetails" : [ ] },
        { "ClientName" : "Larry", "DeveloperDetails" : [ ], "Technology" : [
            { "DeveloperName" : "Chris", "WorkExperience" : 5 }
        ] }
    ]
}

คำอธิบาย

  1. Query: { "ClientDetails.ClientName": "Larry" } Match Element ใน ClientDetails Array
  2. Update: { $addToSet: { "ClientDetails.$.Technology": { ... } } } - $ อ้างอิง Element ที่ Match
  3. $addToSet เพิ่ม Object ใหม่เข้า Technology Array (สร้าง Array ใหม่ถ้ายังไม่มี)

Array Update Operators เปรียบเทียบ

OperatorพฤติกรรมDuplicate
$pushเพิ่มต่อท้ายเสมอ✅ อนุญาต
$addToSetเพิ่มก็ต่อเมื่อไม่มี❌ กัน Duplicate
$push + $eachเพิ่มหลายค่าพร้อมกัน✅ อนุญาต
$addToSet + $eachเพิ่มหลายค่า กัน Duplicate❌ กัน Duplicate
$set (Positional)แทนที่ Element ทั้งตัวN/A

Modern Syntax (MongoDB 3.6+)

// updateOne/UpdateMany + Array Filters (แม่นยำกว่า Positional $)
db.updateArrayDemo.updateOne(
    { "ClientDetails.ClientName": "Larry" },
    { $addToSet: { "ClientDetails.$[elem].Technology": { DeveloperName: "Chris", WorkExperience: 5 } } },
    { arrayFilters: [{ "elem.ClientName": "Larry" }] }
);

Array Filters ข้อดี

  • Match หลายเงื่อนไขใน Element เดียวกัน
  • Update หลาย Element ใน Array เดียวได้ (Multi-match)
  • อ่านง่ายกว่า Positional $