Det första du gör fel här är att inte förstå hur $project
är tänkt att fungera. Pipelinestadier som $project
och $group
kommer bara att mata ut de fält som är "explicit" identifierade. Så endast de fält som du säger till utmatningen kommer att vara tillgängliga för följande pipeline-steg.
Specifikt här "projicerar" du bara en del av "u"-fältet i ditt dokument och du tog därför bort övriga uppgifter från att vara tillgängliga. Det enda aktuella fältet här nu är "namn", vilket är det du "projicerade".
Det kanske verkligen var din avsikt att göra något sånt här:
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 till och med:
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 ger dig den typ av utdata du letar efter.
Kom ihåg att eftersom detta är en "pipeline", så är bara "output" från ett tidigare steg tillgängligt till "nästa" steg. Det finns inget "globalt" koncept för dokumentet eftersom detta inte är en deklarativ sats som i SQL, utan en "pipeline".
Så tänk Unix pipe "|" kommando, eller på annat sätt slå upp det. Då kommer ditt tänkande att falla på plats.