Het eerste dat je hier verkeerd doet, is niet begrijpen hoe $project
bedoeld is om te werken. Pijplijnstadia zoals $project
en $group
zal alleen de velden uitvoeren die "expliciet" zijn geïdentificeerd. Dus alleen de velden waarvan u zegt dat ze moeten worden uitgevoerd, zijn beschikbaar voor de volgende pijplijnfasen.
Specifiek hier "projecteert" u slechts een deel van het "u"-veld in uw document en heeft u daarom de andere gegevens verwijderd om beschikbaar te zijn. Het enige huidige veld hier is nu "naam", dat is het veld dat u "geprojecteerd" heeft.
Misschien was het echt je bedoeling om zoiets als dit te doen:
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 }
])
Of zelfs:
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 }
])
Dat geeft je het soort output waarnaar je op zoek bent.
Onthoud dat aangezien dit een "pijplijn" is, alleen de "output" van een eerdere fase beschikbaar is voor de "volgende" fase. Er is geen "algemeen" concept van het document, aangezien dit geen declaratieve verklaring is zoals in SQL, maar een "pijplijn".
Dus denk aan Unix-pijp "|" commando, of zoek dat anders op. Dan vallen je gedachten op hun plaats.