การอัปเดต 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