การเพิ่มข้อมูลเข้าไปในอาร์เรย์ที่อยู่ภายในออบเจกต์ซ้อน (nested array in object) ใช้ updateOne() ร่วมกับ $push และ $elemMatch เพื่อระบุตำแหน่งที่ถูกต้อง
> db.demo526.insertOne({
... "CountryName": "US",
... "TeacherName": "Bob",
... "StudentInformation": [
... {"Name": "Chris", "Subject": "MySQL", "ListOfMailId": []},
... {"Name": "David", "Subject": "MongoDB", "ListOfMailId": []}
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e8af031437efc8605595b6b") }
แสดงข้อมูล:
> db.demo526.find();
คิวรีเพิ่ม Email ให้ David ที่เรียน MongoDB
> db.demo526.updateOne( ... { ... _id: ObjectId("5e8af031437efc8605595b6b"), ... "StudentInformation": {$elemMatch: {"Name": "David", "Subject": "MongoDB"}} ... }, ... { ... $push: {"StudentInformation.$.ListOfMailId": {"MailId": "David@gmail.com"}} ... } ... ); { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }ผลลัพธ์ - David ได้ Email เพิ่มเข้ามา:
คำอธิบาย
- $elemMatch: จับคู่ออบเจกต์ในอาร์เรย์ที่ตรงเงื่อนไขหลายฟิลด์ (Name และ Subject)
- Positional $: อ้างอิงออบเจกต์ที่ $elemMatch จับได้
- $push: เพิ่มออบเจกต์ใหม่เข้าไปในอาร์เรย์ ListOfMailId
วิธีนี้ปลอดภัยกว่าใช้ index ตรงๆ เพราะไม่ต้องกังวลลำดับของอาร์เรย์เปลี่ยนไป