Aggregation Framework: Tìm học sinh điểm bài 1 < trung bình chung
Sử dụng pipeline aggregation phức tạp để so sánh điểm bài kiểm tra đầu tiên (Value1) với trung bình của tất cả các bài kiểm tra.
1. Dữ liệu mẫu
> db.demo432.insertOne({
_id: 101, Name: "David", Value1: 67, Value2: 87, Value3: 78
});
{ "acknowledged": true, "insertedId": 101 }
> db.demo432.insertOne({
_id: 102, Name: "Sam", Value1: 98, Value2: 45, Value3: 90
});
{ "acknowledged": true, "insertedId": 102 }
2. Pipeline aggregation
> db.demo432.aggregate([
{
$project: {
Name: "$Name",
Value1: "$Value1",
average: { $avg: ["$Value1", "$Value2", "$Value3"] }
}
},
{
$group: {
_id: null,
NameValue1: {
$push: { Name: "$Name", Value1: "$Value1" }
},
totalAverage: { $avg: "$average" }
}
},
{
$project: {
lessthanAverageNames: {
$map: {
input: {
$filter: {
input: "$NameValue1",
as: "out",
cond: { $lt: ["$$out.Value1", "$totalAverage"] }
}
},
as: "o",
in: "$$o.Name"
}
}
}
}
])
3. Kết quả
{ "_id": null, "lessthanAverageNames": ["David"] }
Giải thích logic
- $project (stage 1): Tính trung bình 3 bài cho mỗi học sinh
- $group: Thu thập tất cả (Name, Value1) và tính trung bình chung của cả lớp
- $project (stage 3): Lọc các học sinh có Value1 < totalAverage, chỉ trả về tên
Ứng dụng thực tế: Xác định học sinh cần hỗ trợ thêm ở môn/bài đầu tiên so với trình độ trung bình.