Den første ting du gør forkert her er ikke at forstå hvordan $project
er beregnet til at virke. Pipeline stadier såsom $project
og $group
vil kun udskrive de felter, der er "eksplicit" identificeret. Så kun de felter, du siger til output, vil være tilgængelige for de følgende pipeline-trin.
Konkret her "projicerer" du kun en del af "u"-feltet i dit dokument og du fjernede derfor de øvrige data fra at være tilgængelige. Det eneste nuværende felt her nu er "navn", som er det du "projicerede".
Måske var det virkelig din hensigt at gøre sådan noget:
db.collectiontmp.aggregate([
{ "$group": {
"_id": {
"_id": "$u._id",
"email": { "$toUpper": "$u.e" }
},
"total": { "$sum": 1 },
}},
{ "$project": {
"_id": 0,
"email": "$_id.email",
"total": 1
}},
{ "$sort": { "total": -1 } },
{ "$limit": 10 }
])
Eller endda:
db.collectiontmp.aggregate([
{ "$group": {
"_id": "$u._id",
"email": { "$first": { "$toUpper": "$u.e" } }
"total": { "$sum": 1 },
}},
{ "$project": {
"_id": 0,
"email": 1,
"total": 1
}},
{ "$sort": { "total": -1 } },
{ "$limit": 10 }
])
Det giver dig den slags output, du leder efter.
Husk, at da dette er en "pipeline", så er kun "output" fra et tidligere trin tilgængeligt til det "næste" trin. Der er ikke noget "globalt" koncept for dokumentet, da dette ikke er en deklarativ erklæring som i SQL, men en "pipeline".
Så tænk Unix-rør "|" kommando, eller på anden måde slå det op. Så falder din tankegang på plads.