ここで最初に間違っているのは、<を理解していないことです。 code> $ project
動作することを目的としています。 $ project
などのパイプラインステージ
および $ group
「明示的に」識別されたフィールドのみを出力します。したがって、出力するように指定したフィールドのみが、次のパイプラインステージで使用可能になります。
具体的には、ここでは、ドキュメントの「u」フィールドの一部のみを「投影」するため、他のデータを利用できなくなります。現在ここにある唯一のフィールドは、「投影」した「名前」です。
おそらく、このようなことをするのは本当にあなたの意図でした:
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 }
])
または:
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 }
])
それはあなたが探している種類の出力をあなたに与えます。
これは「パイプライン」であるため、前のステージからの「出力」のみが「次の」ステージで使用できることに注意してください。これはSQLのような宣言型のステートメントではなく、「パイプライン」であるため、ドキュメントの「グローバル」な概念はありません。
したがって、Unixパイプ「|」を考えてください。コマンド、またはそれ以外の場合はそれを調べます。そうすれば、あなたの思考は適切になります。