Ce l'hai quasi fatta...
db.test.aggregate(
{$group: {_id: '$postcode', students: {$sum: 1}}},
{$sort: {_id: -1}}
);
dà (ho aggiunto alcuni dati di test corrispondenti al tuo campione):
{
"result" : [
{
"_id" : 2003,
"students" : 3
},
{
"_id" : 2002,
"students" : 1
},
{
"_id" : 2001,
"students" : 2
}
],
"ok" : 1
}
Avevi un {}
esterno intorno a tutto, il che stava creando un po' di confusione. Il gruppo e l'ordinamento non funzionavano come operazioni separate nella pipeline.
Non avevi davvero bisogno del progetto per questo caso.
Aggiorna Probabilmente vorrai ordinare per "studenti", in questo modo, per ottenere prima i codici postali più grandi (per popolazione):
db.test.aggregate(
{$group: {_id: '$postcode', students: {$sum: 1}}},
{$sort: {students: -1}}
);