Pierwszą rzeczą, którą robisz źle, jest niezrozumienie, jak $project
ma działać. Etapy potoku, takie jak $project
i $group
wyprowadzi tylko pola, które są "jawnie" zidentyfikowane. Tak więc tylko pola, które powiesz do wyjścia, będą dostępne dla następujących etapów potoku.
W szczególności tutaj „projektujesz” tylko część pola „u” w swoim dokumencie, a zatem usuwasz inne dane z dostępnych. Jedynym obecnym polem tutaj jest teraz „imię”, które jest tym, które „zaprojektowałeś”.
Być może naprawdę chciałeś zrobić coś takiego:
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 }
])
Lub nawet:
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 }
])
Daje to rodzaj wyjścia, którego szukasz.
Pamiętaj, że ponieważ jest to „potok”, to tylko „wyjście” z poprzedniego etapu jest dostępne dla „następnego” etapu. Nie ma „globalnej” koncepcji dokumentu, ponieważ nie jest to deklaratywna instrukcja, taka jak w SQL, ale „potok”.
Pomyśl więc uniksowy potok "|" polecenie lub w inny sposób to sprawdzić. Wtedy twoje myślenie się ułoży.