Hal pertama yang Anda lakukan salah di sini adalah tidak memahami bagaimana $project
dimaksudkan untuk bekerja. Tahapan pipeline seperti $project
dan $group
hanya akan menampilkan bidang yang diidentifikasi "secara eksplisit". Jadi, hanya bidang yang Anda katakan ke output yang akan tersedia untuk tahapan pipeline berikut.
Khususnya di sini Anda "memproyeksikan" hanya sebagian dari bidang "u" di dokumen Anda dan karena itu Anda menghapus data lain agar tidak tersedia. Satu-satunya bidang yang ada di sini sekarang adalah "nama", yang merupakan bidang yang Anda "proyeksikan".
Mungkin itu benar-benar niat Anda untuk melakukan sesuatu seperti ini:
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 }
])
Atau bahkan:
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 }
])
Itu memberi Anda jenis keluaran yang Anda cari.
Ingatlah bahwa karena ini adalah "pipa", maka hanya "keluaran" dari tahap sebelumnya yang tersedia untuk tahap "berikutnya". Tidak ada konsep "global" dari dokumen karena ini bukan pernyataan deklaratif seperti di SQL, tetapi "pipa".
Jadi pikirkan pipa Unix "|" perintah, atau mencari itu. Maka pemikiran Anda akan jatuh pada tempatnya.