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

วิธีรวมเอกสารหลายฉบับใน MongoDB


การรวมเอกสารหลายฉบับด้วย 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 - เลือกฟิลด์ที่ต้องการแสดงผล