Skip to main content

การเรียนรู้ MongoDB Aggregation Framework

บทนำ

MongoDB Aggregation Framework เป็นเครื่องมือที่ทรงพลังในการประมวลผลข้อมูลและวิเคราะห์ข้อมูลที่ซับซ้อน ช่วยให้เราสามารถเปลี่ยนรูปแบบข้อมูลและคำนวณค่าได้ในหลายขั้นตอนผ่านการใช้ aggregation pipeline


โครงสร้างพื้นฐานของ Aggregation Pipeline

Aggregation Pipeline ประกอบด้วยชุดของ stages (ขั้นตอน) ที่ดำเนินการกับเอกสารในคอลเลคชัน โดยแต่ละขั้นตอนจะรับข้อมูลจากขั้นตอนก่อนหน้าและส่งออกข้อมูลไปยังขั้นตอนถัดไป

ตัวอย่างโครงสร้าง:

// การเรียกใช้ aggregation pipeline

db.collection.aggregate([
{ stage1 },
{ stage2 },
...
]);

ขั้นตอนหลัก (Stages) ที่สำคัญใน Aggregation Framework

1. $match

ใช้สำหรับกรองข้อมูลตามเงื่อนไขที่กำหนด (คล้ายกับ find())

// ตัวอย่าง: ดึงข้อมูลผู้ใช้ที่อายุมากกว่า 25

db.users.aggregate([
{ $match: { age: { $gt: 25 } } }
]);

2. $group

ใช้สำหรับจัดกลุ่มข้อมูลตามฟิลด์ และสามารถใช้ฟังก์ชันสะสม (Accumulator Functions) เช่น $sum, $avg, $min, $max

// ตัวอย่าง: คำนวณจำนวนผู้ใช้ในแต่ละเมือง

db.users.aggregate([
{
$group: {
_id: "$city",
totalUsers: { $sum: 1 }
}
}
]);

3. $project

ใช้เพื่อเลือกหรือสร้างฟิลด์ใหม่ในผลลัพธ์

// ตัวอย่าง: แสดงเฉพาะฟิลด์ชื่อและอายุ

db.users.aggregate([
{
$project: {
name: 1,
age: 1,
_id: 0
}
}
]);

4. $sort

ใช้เพื่อจัดเรียงเอกสารในผลลัพธ์

// ตัวอย่าง: เรียงข้อมูลผู้ใช้ตามอายุจากมากไปน้อย

db.users.aggregate([
{ $sort: { age: -1 } }
]);

5. $limit

ใช้เพื่อจำกัดจำนวนเอกสารในผลลัพธ์

// ตัวอย่าง: ดึงข้อมูลผู้ใช้เพียง 5 คนแรก

db.users.aggregate([
{ $limit: 5 }
]);

6. $skip

ใช้เพื่อข้ามเอกสารในผลลัพธ์

// ตัวอย่าง: ข้ามผู้ใช้ 10 คนแรก

db.users.aggregate([
{ $skip: 10 }
]);

7. $unwind

ใช้สำหรับ "แยก" ค่าในอาเรย์ให้กลายเป็นเอกสารหลายรายการ

// ตัวอย่าง: แยกแท็กในอาเรย์ "tags"

db.articles.aggregate([
{ $unwind: "$tags" }
]);

ตัวอย่างการใช้งาน Aggregation Framework

ตัวอย่าง: คำนวณยอดขายรวมของแต่ละสินค้า

// คำนวณยอดขายรวมของสินค้า

db.sales.aggregate([
{
$group: {
_id: "$product",
totalSales: { $sum: "$amount" }
}
},
{ $sort: { totalSales: -1 } }
]);

ตัวอย่าง: การวิเคราะห์ข้อมูลผู้ใช้

// แสดงข้อมูลสรุปผู้ใช้ตามอายุ

db.users.aggregate([
{ $match: { age: { $gte: 18 } } },
{
$group: {
_id: null,
avgAge: { $avg: "$age" },
minAge: { $min: "$age" },
maxAge: { $max: "$age" }
}
}
]);

ฟังก์ชันสะสม (Accumulator Functions)

ฟังก์ชันคำอธิบาย
$sumผลรวมของค่าทั้งหมด
$avgค่าเฉลี่ยของค่าทั้งหมด
$minค่าน้อยที่สุด
$maxค่ามากที่สุด
$pushรวมค่าเข้าในอาเรย์
$addToSetรวมค่าเฉพาะที่ไม่ซ้ำกันเข้าในอาเรย์

ข้อดีของ Aggregation Framework

  • ลดความซับซ้อนในการจัดการข้อมูล
  • รองรับการประมวลผลข้อมูลขนาดใหญ่
  • มีประสิทธิภาพสูงเมื่อเปรียบเทียบกับการเขียน Query ซับซ้อน

สรุป

MongoDB Aggregation Framework เป็นเครื่องมือที่ทรงพลังสำหรับการจัดการและวิเคราะห์ข้อมูล การทำความเข้าใจ stages และฟังก์ชันต่าง ๆ จะช่วยให้สามารถสร้าง pipeline ที่ตอบโจทย์ความต้องการได้อย่างมีประสิทธิภาพ