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

การทำ Aggregation สำหรับเอกสารซ้อน (Nested Documents) ใน MongoDB

Aggregation สำหรับ Nested Documents ลึกใน MongoDB

บทความนี้สาธิตการใช้ Aggregation Pipeline เพื่อคำนวณผลรวม (Sum) ของค่าต่างๆ ภายในเอกสารที่ซ้อนกันหลายชั้น (Deeply Nested Documents) โดยใช้ $unwind และ $group

ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง

สร้าง collection ชื่อ demo199 ซึ่งมีโครงสร้างซ้อนกัน 5 ชั้น: details1.details2.details3.details4.details5 ภายในมีค่า v1, v2, v3

> db.demo199.insertOne({
    "details1": {
        "details2": {
            "details3": {
                "Name": "Chris",
                "details4": {
                    "details5": { "v1": 10, "v2": 20, "v3": 30 }
                }
            }
        }
    }
});
{ "acknowledged": true, "insertedId": ObjectId("5e3c24aa03d395bdc21346e2") }

> db.demo199.insertOne({
    "details1": {
        "details2": {
            "details3": {
                "Name": "Chris",
                "details4": {
                    "details5": { "v1": 30, "v2": 40, "v3": 50 }
                }
            }
        }
    }
});
{ "acknowledged": true, "insertedId": ObjectId("5e3c24ab03d395bdc21346e3") }

ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด

> db.demo199.find();

ผลลัพธ์:

{ "_id": ObjectId("5e3c24aa03d395bdc21346e2"), "details1": { "details2": { "details3": { "Name": "Chris", "details4": { "details5": { "v1": 10, "v2": 20, "v3": 30 } } } } }
{ "_id": ObjectId("5e3c24ab03d395bdc21346e3"), "details1": { "details2": { "details3": { "Name": "Chris", "details4": { "details5": { "v1": 30, "v2": 40, "v3": 50 } } } } }

ขั้นตอนที่ 3: Aggregation Pipeline สำหรับคำนวณผลรวม

ใช้ $unwind เพื่อแยกชั้น details1.details2 (แม้จะมีเพียง 1 ต่อเอกสาร) แล้ว $group เพื่อรวมค่า v1, v2, v3 ด้วย $sum

> var out = [
    { "$unwind": "$details1.details2" },
    { "$group": {
        "_id": "$details1.details2._id",
        "v1": { "$sum": "$details1.details2.details3.details4.details5.v1" },
        "v2": { "$sum": "$details1.details2.details3.details4.details5.v2" },
        "v3": { "$sum": "$details1.details2.details3.details4.details5.v3" }
    }}
];
> result = db.demo199.aggregate(out);

ผลลัพธ์ที่ได้

{ "_id": null, "v1": 40, "v2": 60, "v3": 80 }

สรุป: แม้โครงสร้างข้อมูลจะซ้อนกันลึก ก็สามารถใช้ $unwind เลื่อนชั้นทีละขั้น และใช้ $group รวมค่าตัวเลขได้ โดยต้องระบุ path ให้ถูกต้องตามระดับการซ้อน