Mongodb 聚合框架需要将字段值与组总数匹配

Mongodb 聚合框架需要将字段值与组总数匹配,mongodb,match,aggregation-framework,Mongodb,Match,Aggregation Framework,我收集了一些学生文档,如: { "_id" : 1, "Student" : "Sim", "Test1" : 59, "Test2" : 94, "Test3" : 81 } { "_id" : 2, "Student" : "Sam", "Test1" : 60, "Test2" : 77, "Test3" : 81 } 我需要使用

我收集了一些学生文档,如:

{
        "_id" : 1,
        "Student" : "Sim",
        "Test1" : 59,
        "Test2" : 94,
        "Test3" : 81
}
{
        "_id" : 2,
        "Student" : "Sam",
        "Test1" : 60,
        "Test2" : 77,
        "Test3" : 81
}
我需要使用聚合框架,对测试1分数低于全班所有测试总平均分的学生进行筛选

我可以在下面的分组中得到总平均数,但是

如果


那时,我失去了学生和测试1,无法在匹配部分进行比较。

使用
$push+$filter

$group
阶段中的
$push
保留所有
test1
分数和
学生
姓名,然后在
$project
阶段中的
$filter
将其与总平均分数进行比较,并保留匹配记录

您可以将
$filter
包装在
$map
中,以仅投影学生姓名

db.students.aggregate([{
        $project: {
            Stu: '$Student',
            Test1: '$Test1',
            av: {
                $avg: ['$Test1', '$Test2', '$Test3']
            }
        }
    },
    {
        $group: {
            _id: null,
            studentTest1: {
                $push: {
                    "Student": "$Stu",
                    "Test1": "$Test1"
                }
            },
            totAvg: {
                $avg: '$av'
            }
        }
    },
    { $project:
     { lessthanAvgStudentNames:
        {
          $map:
             {
               input: {
                    $filter: {
                        input: "$studentTest1",
                        as: "resultf",
                        cond: {
                            $lt: ["$$resultf.Test1", "$totAvg"]
                        }
                    }
                },
               as: "resultm",
               in: "$$resultm.Student"
             }
        }
     }
   }
]);

谢谢真管用!($filter,对我来说是新事物.,,,)。我怎么能只说出sudent的名字呢?不客气。更新答案,包括
$map
以仅投影学生姓名。链接此处和
db.students.aggregate([{
        $project: {
            Stu: '$Student',
            Test1: '$Test1',
            av: {
                $avg: ['$Test1', '$Test2', '$Test3']
            }
        }
    },
    {
        $group: {
            _id: null,
            studentTest1: {
                $push: {
                    "Student": "$Stu",
                    "Test1": "$Test1"
                }
            },
            totAvg: {
                $avg: '$av'
            }
        }
    },
    { $project:
     { lessthanAvgStudentNames:
        {
          $map:
             {
               input: {
                    $filter: {
                        input: "$studentTest1",
                        as: "resultf",
                        cond: {
                            $lt: ["$$resultf.Test1", "$totAvg"]
                        }
                    }
                },
               as: "resultm",
               in: "$$resultm.Student"
             }
        }
     }
   }
]);