db.grades.aggregate([ { $unwind: "$scores" }, { $match: { "scores.type": {$ne: "quiz"} } }, { $group: { _id: { class_id: "$class_id", student_id: "$student_id" }, avg_student: {$avg: "$scores.score"} } }, { $group: { _id: "$_id.class_id", avg_class: {$avg: "$avg_student"} } }, { $sort: {avg_class: -1} } ]);