Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Tìm học sinh có điểm bài kiểm tra 1 nhỏ hơn trung bình tất cả bài kiểm tra

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

  1. $project (stage 1): Tính trung bình 3 bài cho mỗi học sinh
  2. $group: Thu thập tất cả (Name, Value1) và tính trung bình chung của cả lớp
  3. $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.