Първото нещо, което правите погрешно тук, е да не разбирате как $project
е предназначен да работи. Етапи на конвейера като $project
и $group
ще изведе само полетата, които са "изрично" идентифицирани. Така че само полетата, които казвате за извеждане, ще бъдат достъпни за следващите етапи на конвейера.
По-конкретно тук „проектирате“ само част от полето „u“ във вашия документ и следователно сте премахнали другите данни от достъпност. Единственото налично поле тук сега е „име“, което е това, което „прожектирате“.
Може би наистина сте имали намерението да направите нещо подобно:
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 }
])
Или дори:
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 }
])
Това ви дава вида резултат, който търсите.
Не забравяйте, че тъй като това е "тръбопровод", тогава само "изходът" от предходен етап е достъпен за "следващия" етап. Няма "глобална" концепция за документа, тъй като това не е декларативен израз като в SQL, а "тръбопровод".
Така че помислете за Unix тръба "|" команда или потърсете това по друг начин. Тогава вашето мислене ще си дойде на мястото.