El $redact la etapa comienza en el documento raíz y sus campos, y solo cuando ese documento cumple la condición para $$DESCEND , examina los subdocumentos incluidos en dicho documento. Eso significa que lo primero que hace $redact con su documento es examinar esto:
{
"_id" : ObjectId("50b59cd75bed76f46522c34e"),
"student_id" : 0,
"class_id" : 2,
"scores" : [] // Some array. I will look at this later.
}
Ni siquiera encuentra un type campo aquí, entonces $eq: [ "$type" , "exam" ] Es falso. ¿Qué le dijiste a $redact que hiciera cuando la condición es falsa? else: "$$PRUNE" , por lo que todo el documento se elimina antes de que se examinen los subdocumentos.
Como solución, prueba si $type es "exam" o no existe. No pediste explícitamente una solución que funcionara, así que te dejaré como ejercicio que averigües cómo hacerlo.