$addToSet เพิ่มค่าในอาร์เรย์ก็ต่อเมื่อค่ายังไม่มีอยู่ (ป้องกันซ้ำ) สามารถใช้กับอาร์เรย์ซ้อนหลายชั้นได้ด้วย Positional Operator $
ตัวอย่างข้อมูลทดสอบ
> db.demo380.insertOne({
"details" : [
{"Name" : "Chris", "details1" : []},
{"Name" : "David", "details1" : []}
]
});
แสดงข้อมูลก่อน
> db.demo380.find().pretty();
{
"_id" : ObjectId("5e5b56e32ae06a1609a00b11"),
"details" : [
{"Name" : "Chris", "details1" : []},
{"Name" : "David", "details1" : []}
]
}
คำสั่งเพิ่มออบเจ็กต์ลง details1 ของ David
> db.demo380.update(
{"details.Name": "David"},
{$addToSet: {"details.$.details1": {'SubjectName': "MongoDB", 'TeacherName':"Bob"}}},
false, true
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ผลลัพธ์หลังเพิ่ม
> db.demo380.find().pretty();
{
"_id" : ObjectId("5e5b56e32ae06a1609a00b11"),
"details" : [
{"Name" : "Chris", "details1" : []},
{"Name" : "David", "details1" : [
{"SubjectName" : "MongoDB", "TeacherName" : "Bob"}
]}
]
}
คำอธิบาย:
- Query
{"details.Name": "David"}หาเอกสารที่มี details.Name = David details.$.details1ใช้$อ้างอิงตำแหน่งของ details ที่ match แล้วเข้าถึง details1$addToSetเพิ่มออบเจ็กต์ใหม่ก็ต่อเมื่อยังไม่มีใน details1- พารามิเตอร์สุดท้าย
false, true= upsert: false, multi: true (อัปเดตทุกเอกสารที่ match)