รวม $pull กับ Positional Operator $ เพื่อลบ Element ใน Nested Array (Array ภายใน Object ที่อยู่ใน Array) โดยระบุตำแหน่ง Object แม่ผ่าน $elemMatch
สร้างคอลเลกชันและข้อมูลตัวอย่าง (Nested Array)
> db.pullWithPositionalOperatorDemo.insertOne({
_id: 100,
"StudentDetails": [
{"StudentId": "STU-1", "StudentFavouriteSubject": ["MongoDB", "Java"]},
{"StudentId": "STU-2", "StudentFavouriteSubject": ["PHP", "MySQL"]}
]
});
{ "acknowledged": true, "insertedId": 100 }
แสดงข้อมูลก่อนลบ
> db.pullWithPositionalOperatorDemo.find().pretty();
ผลลัพธ์: 2 Students แต่ละคนมี Array วิชา
คำสั่ง: ลบ "MySQL" จาก StudentFavouriteSubject ของ StudentId = "STU-2"
> db.pullWithPositionalOperatorDemo.update(
{
"StudentDetails": {
$elemMatch: {
"StudentId": "STU-2",
"StudentFavouriteSubject": "MySQL"
}
}
},
{
$pull: {
"StudentDetails.$.StudentFavouriteSubject": "MySQL"
}
},
{multi: true}
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
ตรวจสอบผลลัพธ์
> db.pullWithPositionalOperatorDemo.find().pretty();
STU-2 เหลือแค่ PHP แล้ว:
{
"_id": 100,
"StudentDetails": [
{"StudentId": "STU-1", "StudentFavouriteSubject": ["MongoDB", "Java"]},
{"StudentId": "STU-2", "StudentFavouriteSubject": ["PHP"]}
]
}
การทำงาน
$elemMatchใน Query: หา Element ใน StudentDetails ที่ StudentId="STU-2" และ มี "MySQL" ใน StudentFavouriteSubject$(Positional): อ้างอิง Element ที่ Match จาก Query (STU-2 Object)$pullบนStudentDetails.$.StudentFavouriteSubject: ลบ "MySQL" จาก Array นั้น
รูปแบบใหม่ (MongoDB 3.6+): Filtered Positional Operator $[]
db.pullWithPositionalOperatorDemo.updateOne(
{_id: 100},
{$pull: {"StudentDetails.$[elem].StudentFavouriteSubject": "MySQL"}},
{arrayFilters: [{"elem.StudentId": "STU-2"}]}
);
ข้อดี: ไม่ต้อง $elemMatch ใน Query, รองรับหลาย Array Filters, อ่านง่ายกว่า
สรุปตำแหน่ง Positional Operators
| Operator | ใช้ใน | ความหมาย |
|---|---|---|
$ | Projection / Update (Legacy) | Element แรกที่ Match Query Condition |
$[identifier] | Update (MongoDB 3.6+) | Element ที่ Match ArrayFilters ที่กำหนด |
$[] | Update (MongoDB 3.6+) | ทุก Element ใน Array (All Elements) |