ใช้ 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