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

MongoDBの集計フレームワークで複数の列をグループ化して合計することは可能ですか?

    MongoDB 3.4以降、これは$facetで複数の集約パイプラインを使用して少し簡単に実現できます。 。

    docs から取得 :

    したがって、ユースケースの場合、これは次の方法で実現されます。

    const aggregatorOpts = [
        { $match: { character: 'broquaint' } }, // Match the character
        {
            // Seperate into 2 or more pipes that will count class and
            // race seperatly
            $facet: {
                race: [
                    // Group by race and get the count:
                    // [
                    //   {
                    //     _id: 'Halfling',
                    //     count: 3
                    //   }
                    //   {
                    //     _id: 'Naga',
                    //     count: 2
                    //   }
                    // ]
    
                    // $sortByCount is the same as
                    // { $group: { _id: <expression>, count: { $sum: 1 } } },
                    // { $sort: { count: -1 } }
    
                    { $sortByCount: '$race' },
    
                    // Now we want to transform the array in to 1 document,
                    // where the '_id' field is the key, and the 'count' is the value.
                    // To achieve this we will use $arrayToObject. According the the
                    // docs, we have to first rename the fields to 'k' for the key,
                    // and 'v' for the value. We use $project for this:
                    {
                        $project: {
                            _id: 0,
                            k: '$_id',
                            v: '$count',
                        },
                    },
                ],
                // Same as above but for class instead
                class: [
                    { $sortByCount: '$class' },
                    {
                        $project: {
                            _id: 0,
                            k: '$_id',
                            v: '$count',
                        },
                    },
                ],
            },
        },
        {
            // Now apply the $arrayToObject for both class and race.
            $addFields: {
                // Will override the existing class and race arrays
                // with their respective object representation instead.
                class: { $arrayToObject: '$class' },
                race: { $arrayToObject: '$race' },
            },
        },
    ];
    
    db.races.aggregate(aggregatorOpts)
    

    これにより、次のようになります。

    [
      {
        "race": {
          "Halfling": 3,
          "Naga": 2
        },
        "class": {
          "Hunter": 3,
          "Rogue": 1,
          "Fighter": 1,
        }
      }
    ]
    

    @Asyaで提供される出力フォーマットに満足している場合は、$projectを削除できます。 および$addFields ステージし、$sortByCountをそのままにします 各サブパイプラインの一部です。

    これらの新機能を使用すると、カウントを追加して集計を拡張するのがはるかに簡単になります。$facetに別の集計パイプラインを追加するだけです。 。サブグループを数えるのは少し簡単ですが、それは別の質問になります。



    1. コード8で終了サンプル流星アプリケーション

    2. マングースの.in()演算子とall。()演算子の違いは何ですか?

    3. 複数の言語を使用したmongodbテキスト検索

    4. Node js POSTリクエストエラーエラー[ERR_HTTP_HEADERS_SENT]:クライアントに送信された後にヘッダーを設定できません