Điều đầu tiên bạn đang làm sai ở đây là không hiểu cách $project
được dự định để làm việc. Các giai đoạn đường ống, chẳng hạn như $project
và $group
sẽ chỉ xuất ra các trường được xác định "rõ ràng". Vì vậy, chỉ những trường bạn nói để xuất sẽ có sẵn cho các giai đoạn chuyển tiếp sau.
Cụ thể ở đây, bạn chỉ "chiếu" một phần của trường "u" trong tài liệu của mình và do đó bạn đã xóa dữ liệu khác khỏi khả dụng. Trường hiện tại duy nhất ở đây bây giờ là "tên", là trường mà bạn đã "chiếu".
Có lẽ đó thực sự là ý định của bạn khi làm điều gì đó như thế này:
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 }
])
Hoặc thậm chí:
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 }
])
Điều đó cung cấp cho bạn loại đầu ra mà bạn đang tìm kiếm.
Hãy nhớ rằng vì đây là một "đường ống", khi đó chỉ "đầu ra" từ giai đoạn trước mới có sẵn cho giai đoạn "tiếp theo". Không có khái niệm "toàn cục" của tài liệu vì đây không phải là một câu lệnh khai báo như trong SQL, mà là một "đường dẫn".
Vì vậy, hãy nghĩ đến đường ống Unix "|" lệnh, hoặc nếu không thì hãy tra cứu. Khi đó, suy nghĩ của bạn sẽ đúng chỗ.