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

MongoDB อัปเดต Array Element ที่ Match ด้วย $push และ Positional $

การอัปเดต Element เฉพาะใน Array ที่ Match เงื่อนไข ใช้ Positional Operator $ ร่วมกับ $push เพื่อเพิ่มค่าเข้า Sub-Array เนื้อหานี้สาธิตการเพิ่ม "MongoDB" เข้า ListOfSubject ของนักเรียนชื่อ "Chris"

ตัวอย่างข้อมูลทดสอบ

> db.demo9.insertOne({
  "StudentDetails": [{
    "StudentName": "Chris",
    "ListOfSubject": ["MySQL", "Java"]
  }]
});
{ "acknowledged": true, "insertedId": ObjectId("5e0f6438d7df943a7cec4f94") }

แสดงข้อมูลเดิม

> db.demo9.find().pretty();
{
  "_id": ObjectId("5e0f6438d7df943a7cec4f94"),
  "StudentDetails": [
    {
      "StudentName": "Chris",
      "ListOfSubject": ["MySQL", "Java"]
    }
  ]
}

Query $push พร้อม Positional $

> db.demo9.update(
  { "StudentDetails.StudentName": "Chris" },
  { $push: { "StudentDetails.$.ListOfSubject": "MongoDB" } }
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })

ผลลัพธ์หลังอัปเดต

> db.demo9.find().pretty();
{
  "_id": ObjectId("5e0f6438d7df943a7cec4f94"),
  "StudentDetails": [
    {
      "StudentName": "Chris",
      "ListOfSubject": ["MySQL", "Java", "MongoDB"]
    }
  ]
}

คำอธิบาย

  • Filter: {"StudentDetails.StudentName": "Chris"} Match Doc ที่ Array มี Element StudentName="Chris"
  • StudentDetails.$.ListOfSubject: $ = Element ใน StudentDetails ที่ Match (Chris), แล้ว Push เข้า ListOfSubject ของ Element นั้น
  • ข้อจำกัด $: อัปเดตได้แค่ Element แรกที่ Match (First Match)
  • MongoDB 3.6+ arrayFilters สำหรับ Multiple Matches:
    db.demo9.update(
      { "StudentDetails.StudentName": "Chris" },
      { $push: { "StudentDetails.$[elem].ListOfSubject": "MongoDB" } },
      { arrayFilters: [{ "elem.StudentName": "Chris" }] }
    )
  • Operator เพิ่มเติมสำหรับ Array:
    • $addToSet: เพิ่มถ้ายังไม่มี (Unique)
    • $each: เพิ่มหลายค่าพร้อมกัน
    • $pop, $pull, $pullAll: ลบ Element