První věc, kterou zde děláte špatně, je, že nerozumíte tomu, jak $project
je určen k práci. Fáze potrubí, jako je $project
a $group
vypíše pouze pole, která jsou "explicitně" identifikována. Takže pouze pole, která vyjádříte jako výstup, budou dostupná pro následující fáze kanálu.
Konkrétně zde "promítnete" pouze část pole "u" ve vašem dokumentu a tím jste odstranili ostatní data z dostupnosti. Jediným přítomným polem je nyní „jméno“, což je to, které jste „promítli“.
Možná to byl váš záměr udělat něco takového:
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 }
])
Nebo dokonce:
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 }
])
To vám dává druh výstupu, který hledáte.
Pamatujte, že jelikož se jedná o „potrubí“, do „následující“ fáze je k dispozici pouze „výstup“ z předchozí fáze. Neexistuje žádný „globální“ koncept dokumentu, protože se nejedná o deklarativní příkaz jako v SQL, ale o „potrubí“.
Takže si představte unixové potrubí "|" příkaz, nebo si to jinak vyhledejte. Pak vaše myšlení zapadne na místo.