ใช้ $push กับ Dot Notation สำหรับอาร์เรย์ซ้อน
เมื่อต้องการเพิ่มข้อมูลลงในอาร์เรย์ที่อยู่ภายในออบเจ็กต์ ให้ใช้ $push ร่วมกับ dot notation ระบุพาธเต็มของอาร์เรย์
ตัวอย่างข้อมูล
> db.demo449.insertOne({
details1: {
details2: [{ _id: new ObjectId(), Name: "Chris" }],
details3: [{ _id: new ObjectId(), Name: "David" }]
}
});
แสดงข้อมูลก่อนเพิ่ม
> db.demo449.find();
ผลลัพธ์:
{ "_id": ObjectId(...), "details1": { "details2": [{ "_id": ObjectId(...), "Name": "Chris" }], "details3": [{ "_id": ObjectId(...), "Name": "David" }] } }
Query เพิ่มข้อมูลลงใน details2
> db.demo449.update(
{ _id: ObjectId("5e7a40e971f552a0ebb0a6e3") },
{ $push: { "details1.details2": { _id: ObjectId(), "Name": "Carol" } } }
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
ผลลัพธ์หลังเพิ่ม
{ "_id": ObjectId(...), "details1": { "details2": [{ "_id": ObjectId(...), "Name": "Chris" }, { "_id": ObjectId(...), "Name": "Carol" }], "details3": [{ "_id": ObjectId(...), "Name": "David" }] } }
จุดสำคัญ
- ใช้ dot notation:
"parent.child.arrayName" - $push เพิ่มข้อมูลต่อท้ายอาร์เรย์อัตโนมัติ
- สามารถเพิ่มออบเจ็กต์สมบูรณ์พร้อม _id ใหม่ได้
- ใช้ updateOne() หรือ updateMany() ตาม MongoDB version ใหม่แทน update()
รูปแบบใหม่ (MongoDB 3.2+)
db.demo449.updateOne(
{ _id: ObjectId("...") },
{ $push: { "details1.details2": { _id: ObjectId(), Name: "Carol" } } }
);