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

อัปเดตเอกสารเฉพาะในอาร์เรย์ด้วย $set และ Positional $ Operator ใน MongoDB


ใช้ updateOne() พร้อม Positional $ Operator

เมื่อต้องการอัปเดตเฉพาะอิลิเมนต์ในอาร์เรย์ที่ตรงเงื่อนไข ให้ใช้ $ (positional operator) ร่วมกับ $set ใน updateOne()

ตัวอย่างข้อมูล

> db.demo462.insertOne({
  "id": 1,
  "DueDateDetails": [
    { "Name": "David", "Age": 21, "CountryName": ["US", "UK"] },
    { "Name": "Chris", "Age": 23, "CountryName": ["UK"] }
  ]
});

Query อัปเดต CountryName ของ Chris เป็น AUS

> db.demo462.updateOne(
  { id: 1, "DueDateDetails.Name": "Chris" },
  { $set: { "DueDateDetails.$.CountryName": "AUS" } }
);
{ "acknowledged": true, "matchedCount": 1, "modifiedCount": 1 }

ผลลัพธ์

{ "_id": ObjectId(...), "id": 1, "DueDateDetails": [
  { "Name": "David", "Age": 21, "CountryName": ["US", "UK"] },
  { "Name": "Chris", "Age": 23, "CountryName": "AUS" }
] }

คำอธิบาย Positional $ Operator

  • DueDateDetails.$ - อ้างอิงอิลิเมนต์ **แรกที่ match** ในอาร์เรย์ DueDateDetails
  • เงื่อนไข match มาจาก query: "DueDateDetails.Name": "Chris"
  • อัปเดตเฉพาะอิลิเมนต์ที่ match ไม่กระทบอิลิเมนต์อื่น

ข้อจำกัด

  • อัปเดตได้เพียง **อิลิเมนต์แรกที่ match** เท่านั้น
  • ไม่รองรับการอัปเดตหลายตำแหน่งพร้อมกัน
  • ไม่ทำงานกับ nested array (อาร์เรย์ในอาร์เรย์)

ทางเลือกสำหรับหลายตำแหน่ง (MongoDB 3.6+)

// ใช้ $[] (all positional) อัปเดตทุกอิลิเมนต์
db.demo462.updateOne(
  { id: 1 },
  { $set: { "DueDateDetails.$[elem].CountryName": "AUS" } },
  { arrayFilters: [{ "elem.Name": "Chris" }] }
);

// ใช้ $[] กับ arrayFilters สำหรับเงื่อนไขซับซ้อน

Filter Array Elements (MongoDB 3.6+)

arrayFilters ช่วยให้ระบุเงื่อนไขสำหรับ positional operator ได้ชัดเจนและยืดหยุ่นกว่า