sql >> データベース >  >> NoSQL >> MongoDB

Mongodbの集計クエリは特定のフィールドを返します

    ここで最初に間違っているのは、<を理解していないことです。 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パイプ「|」を考えてください。コマンド、またはそれ以外の場合はそれを調べます。そうすれば、あなたの思考は適切になります。




    1. MongoDBはすべてのデータベースを削除します

    2. Mongoose / NodeJSのタイムスタンプフィールドで個別の日付アイテムをカウントするにはどうすればよいですか?

    3. 新しい_idを使用してMongoDBでドキュメントを複製します

    4. AngularアプリでのAPI呼び出しでの2つのパラメーターの送信の処理