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"
}
}
}
}
]);