การเรียนรู้ MongoDB Advanced Aggregations
บทนำ
MongoDB Advanced Aggregations เป็นฟีเจอร์ที่ช่วยให้สามารถประมวลผลข้อมูลแบบซับซ้อนในฐานข้อมูล MongoDB ได้ โดยใช้ Aggregation Framework ซึ่งเป็นเครื่องมือทรงพลังที่ประกอบด้วย Pipeline หลายขั้นตอน เพื่อทำงานกับข้อมูล เช่น การกรอง การคำนวณ การจัดกลุ่ม และการแปลงข้อมูล
ส่วนประกอบสำคัญของ Aggregation Framework
1. Aggregation Pipeline
Pipeline ประกอบด้วยหลาย Stage ที่ทำงานเรียงลำดับ โดยแต่ละ Stage จะประมวลผลข้อมูลและส่งผลลัพธ์ไปยัง Stage ถัดไป
ตัวอย่าง:
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: { _id: "$customerId", totalAmount: { $sum: "$amount" } } },
{ $sort: { totalAmount: -1 } }
]);
Advanced Aggregation Stages
1. $lookup
ใช้ในการ Join ข้อมูลจาก Collection อื่น
ตัวอย่าง:
db.orders.aggregate([
{
$lookup: {
from: "customers",
localField: "customerId",
foreignField: "_id",
as: "customerDetails"
}
}
]);
2. $facet
ใช้ในการสร้าง Pipeline หลายชุดและส่งผลลัพธ์พร้อมกัน
ตัวอย่าง:
db.products.aggregate([
{
$facet: {
priceSummary: [
{ $group: { _id: null, avgPrice: { $avg: "$price" }, maxPrice: { $max: "$price" } } }
],
productCount: [
{ $count: "totalProducts" }
]
}
}
]);
3. $graphLookup
ใช้ในการ Query ข้อมูลแบบ Recursion เช่น การค้นหาโครงสร้างข้อมูลแบบ Tree
ตัวอย่าง:
db.employees.aggregate([
{
$graphLookup: {
from: "employees",
startWith: "$managerId",
connectFromField: "managerId",
connectToField: "_id",
as: "subordinates"
}
}
]);
4. $bucket และ $bucketAuto
ใช้ในการจัดกลุ่มข้อมูลเป็นช่วงๆ (Buckets)
ตัวอย่างการใช้ $bucket:
db.sales.aggregate([
{
$bucket: {
groupBy: "$amount",
boundaries: [0, 100, 200, 300],
default: "Other",
output: { totalSales: { $sum: 1 } }
}
}
]);
ตัวอย่างการใช้ $bucketAuto:
db.sales.aggregate([
{
$bucketAuto: {
groupBy: "$amount",
buckets: 3,
output: { totalSales: { $sum: 1 } }
}
}
]);
Advanced Operators
1. Array Operators
$arrayElemAt: ดึงข้อมูลจากตำแหน่งใน Array$concatArrays: รวม Array หลายอัน
ตัวอย่าง:
db.products.aggregate([
{
$project: {
firstTag: { $arrayElemAt: ["$tags", 0] },
allTags: { $concatArrays: ["$tags", ["new"]] }
}
}
]);
2. String Operators
$toUpper: แปลงข้อความเป็นตัวพิมพ์ใหญ่$concat: รวมข้อความหลายส่วนเข้าด้วยกัน
ตัวอย่าง:
db.users.aggregate([
{
$project: {
fullName: { $concat: ["$firstName", " ", "$lastName"] },
upperCaseName: { $toUpper: "$firstName" }
}
}
]);
3. Date Operators
$year,$month,$dayOfMonth: ดึงส่วนของวันที่$dateToString: แปลงวันที่เป็นข้อความ
ตัวอย่าง:
db.orders.aggregate([
{
$project: {
orderYear: { $year: "$orderDate" },
formattedDate: { $dateToString: { format: "%Y-%m-%d", date: "$orderDate" } }
}
}
]);
การปรับแต่งประสิทธิภาพใน Aggregation Framework
1. ใช้ Index อย่างเหมาะสม
- สร้าง Index บนฟิลด์ที่ใช้ใน
$matchเพื่อเพิ่มความเร็ว
2. Pipeline Optimization
- นำ
$matchและ$limitไว้ต้น Pipeline เพื่อลดขนาดข้อมูล
3. Avoid Unnecessary Stages
- ใช้
$projectเพื่อลดจำนวนฟิลด์ที่ส่งผ่านแต่ละ Stage
สรุป
MongoDB Advanced Aggregations ช่วยให้การทำงานกับข้อมูลซับซ้อนใน MongoDB เป็นเรื่องง่ายและมีประสิทธิภาพ การเข้าใจการใช้ Stages และ Operators อย่างลึกซึ้งจะช่วยให้คุณสามารถจัดการและวิเคราะห์ข้อมูลได้อย่างมืออาชีพ