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

ใช้ $addToSet เพิ่มออบเจ็กต์ลงในอาร์เรย์ซ้อนลึก (Deep Nested Array) ใน MongoDB

$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)