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

MongoDB $pull กับ Positional Operator ($) : ลบ Element ใน Nested Array

รวม $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"]}
  ]
}

การทำงาน

  1. $elemMatch ใน Query: หา Element ใน StudentDetails ที่ StudentId="STU-2" และ มี "MySQL" ใน StudentFavouriteSubject
  2. $ (Positional): อ้างอิง Element ที่ Match จาก Query (STU-2 Object)
  3. $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)