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

วิธีเพิ่มค่า (Increment) ใน Nested Array ของ MongoDB ด้วย Positional Operator $

ใช้ Positional Operator ($) ร่วมกับ $inc เพื่อเพิ่มค่าในฟิลด์ที่อยู่ภายในอาร์เรย์ (Nested Array) โดยระบุเงื่อนไข match element

รูปแบบคำสั่ง

db.collection.update(
    { "outerField.innerField": matchValue },
    { $inc: { "outerField.$.targetField": incrementValue } }
);

ตัวอย่างเต็มรูปแบบ

1. สร้างข้อมูลตัวอย่าง (ProjectDetails เป็น Array of Objects)

> db.incrementInNestedArrayDemo.insertOne({
    "StudentId": 100,
    "ProjectDetails": [
        { "ProjectId": 567778888, "TeamSize": 4 },
        { "ProjectId": 67888999, "TeamSize": 2 }
    ]
});

2. แสดงข้อมูลก่อน

> db.incrementInNestedArrayDemo.find().pretty();
{ 
    "_id" : ObjectId("..."), 
    "StudentId" : 100, 
    "ProjectDetails" : [ 
        { "ProjectId" : 567778888, "TeamSize" : 4 },
        { "ProjectId" : 67888999, "TeamSize" : 2 }
    ]
}

3. เพิ่ม TeamSize +1 สำหรับ ProjectId = 67888999

> db.incrementInNestedArrayDemo.update(
    { "StudentId": 100, "ProjectDetails.ProjectId": 67888999 },
    { $inc: { "ProjectDetails.$.TeamSize": 1 } }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

4. ตรวจสอบผลลัพธ์ (TeamSize กลายเป็น 3)

> db.incrementInNestedArrayDemo.find().pretty();
{ 
    "_id" : ObjectId("..."), 
    "StudentId" : 100, 
    "ProjectDetails" : [ 
        { "ProjectId" : 567778888, "TeamSize" : 4 },
        { "ProjectId" : 67888999, "TeamSize" : 3 }   // เพิ่มจาก 2 เป็น 3
    ]
}

คำอธิบาย Positional Operator $

  • $ แทนตำแหน่ง (index) ของ element ในอาร์เรย์ที่ match เงื่อนไข query
  • Query ต้องมีเงื่อนไข match ฟิลด์ในอาร์เรย์: "ProjectDetails.ProjectId": 67888999
  • Update ใช้ "ProjectDetails.$.TeamSize" → $ = element ที่ match
  • ทำงานได้กับอาร์เรย์ระดับเดียว (Single level array)

ขยาย: Nested Array หลายระดับ (MongoDB 3.6+)

// ใช้ $[] สำหรับทุก element หรือ $[] สำหรับ filtered
db.collection.update(
    { "StudentId": 100 },
    { $inc: { "ProjectDetails.$[elem].TeamSize": 1 } },
    { arrayFilters: [ { "elem.ProjectId": 67888999 } ] }
);

สรุป

  • ใช้ $inc + Positional $ สำหรับ increment ใน Nested Array
  • Query ต้อง match ฟิลด์ในอาร์เรย์เพื่อให้ $ รู้ตำแหน่ง
  • MongoDB 3.6+ ใช้ arrayFilters + $[identifier] สำหรับกรณีซับซ้อนกว่า
  • Atomic operation - ปลอดภัยสำหรับ concurrent update