การรวมเอกสารหลายฉบับด้วย Aggregate Pipeline
ใน MongoDB สามารถรวมเอกสารหลายฉบับได้โดยใช้เมธอด aggregate() ซึ่งช่วยให้จัดการข้อมูลซับซ้อนได้อย่างมีประสิทธิภาพ
ตัวอย่างข้อมูลต้นฉบับ
สร้างคอลเลกชันพร้อมเอกสารตัวอย่าง:
> db.demo436.insertOne({ "_id": "101", "Name": "Chris", "details": [{ "CountryName": "US", "Age": 21 }], "Price": 50 });
{ "acknowledged": true, "insertedId": "101" }
> db.demo436.insertOne({ "_id": "102", "Name": "Chris", "details": [{ "CountryName": "UK", "Age": 22 }], "Price": 78 });
{ "acknowledged": true, "insertedId": "102" }
> db.demo436.insertOne({ "_id": "103", "Name": "Chris", "details": [{ "CountryName": "US", "Age": 21 }], "Price": 50 });
{ "acknowledged": true, "insertedId": "103" }
แสดงข้อมูลทั้งหมด
> db.demo436.find();
ผลลัพธ์:
{ "_id": "101", "Name": "Chris", "details": [{ "CountryName": "US", "Age": 21 }], "Price": 50 }
{ "_id": "102", "Name": "Chris", "details": [{ "CountryName": "UK", "Age": 22 }], "Price": 78 }
{ "_id": "103", "Name": "Chris", "details": [{ "CountryName": "US", "Age": 21 }], "Price": 50 }
Query สำหรับรวมเอกสาร
> db.demo436.aggregate([
{ $sort: { _id: 1, Name: 1 } },
{ $unwind: "$details" },
{ $group: {
_id: "$Name",
details: { $push: "$details" },
Price: { $sum: "$Price" },
id: { $last: { $concat: ["$_id", "_", "AppendedValue"] } },
Name: { $last: "$Name" }
}},
{ $addFields: { Id: "NewIdAppped", _id: "$id" }},
{ $project: { "id": 0 }}
])
ผลลัพธ์หลังรวม
{ "_id": "103_AppendedValue", "details": [{ "CountryName": "US", "Age": 21 }, { "CountryName": "UK", "Age": 22 }, { "CountryName": "US", "Age": 21 }], "Price": 178, "Name": "Chris", "Id": "NewIdAppped" }
คำอธิบายขั้นตอนสำคัญ
- $sort - เรียงลำดับเอกสารก่อนประมวลผล
- $unwind - แยกอาร์เรย์ details ออกเป็นเอกสารแยกต่างหาก
- $group - จัดกลุ่มตาม Name และสะสมค่า details, รวมราคา, สร้าง ID ใหม่
- $addFields - เพิ่มฟิลด์ใหม่และปรับ _id
- $project - เลือกฟิลด์ที่ต้องการแสดงผล