2017-04-11 5 views
1

私は現在、集計を使用して統計ページの登録チームとネットを表示しています。私は各レベルでカウントを行うことができますが、ネットの計算は不正確です。次のように私の集約は次のとおりです。mongoとangularを使用した集計によるカスタム演算

module.exports.registrationStats = function(req, res) { 
    Registration.aggregate([ 
    { 
     "$group": { 
      "_id": { 
       "day": "$day", 
       "group": "$group", 
       "division": "$division", 
       "level": "$level" 
      }, 
      "count": { "$sum": 1 } 
     } 
    }, 
    { 
     "$group": { 
      "_id": { 
       "day": "$_id.day", 
       "group": "$_id.group", 
       "division": "$_id.division"     
      }, 
      "count": { "$sum": "$count" }, 
      "levels": { 
       "$push": { 
        "level": "$_id.level", 
        "teams": "$count", 
        "nets" : {$ceil : { $divide: [ "$count" , 5 ] } } 
       } 
      } 
     } 
    }, 
    { 
     "$group": { 
      "_id": { 
       "day": "$_id.day", 
       "group": "$_id.group"    
      }, 
      "count": { "$sum": "$count" }, 
      "divisions": { 
       "$push": { 
        "division": "$_id.division", 
        "count": "$count", 
        "levels": "$levels" 
       } 
      } 
     } 
    } 
]).exec(function(err, regStats){ 
    if(err) { 
     console.log("Error grouping registrations"); 
     res.status(500).json(err); 
    } else { 
     console.log("Found and grouped " + regStats.length + " regStats"); 
     res.json(regStats); 
    } 
    }); 
}; 

これは私に出力として以下を提供します:

[ 
    { 
     "_id": { 
      "day": "Saturday", 
      "group": "nonpro" 
     }, 
     "count": 144, 
     "divisions": [ 
      { 
       "division": "Men's", 
       "count": 69, 
       "levels": [ 
        { 
         "level": "BB", 
         "teams": 30, 
         "nets": 6 
        }, 
        { 
         "level": "A", 
         "teams": 8, 
         "nets": 2 
        }, 
        { 
         "level": "B", 
         "teams": 19, 
         "nets": 4 
        }, 
        { 
         "level": "AA", 
         "teams": 12, 
         "nets": 3 
        } 
       ] 
      }, 
      { 
       "division": "Women's", 
       "count": 75, 
       "levels": [ 
        { 
         "level": "AA", 
         "teams": 9, 
         "nets": 2 
        }, 
        { 
         "level": "BB", 
         "teams": 16, 
         "nets": 4 
        }, 
        { 
         "level": "B", 
         "teams": 18, 
         "nets": 4 
        }, 
        { 
         "level": "A", 
         "teams": 32, 
         "nets": 7 
        } 
       ] 
      } 
     ] 
    } 
] 

問題は、私はちょうどMath.ceil(divisions.count /上の切り上げフィルタを実行することができないということです5)divisions.netsやMath.ceil(_id.count/5)の値を取得して_id.netsを取得することがあります。

divisions.levels.netsを合計してdivisions.netsにプッシュし、divisions.netsを追加して、その値を_id.netsに入れて、計算が正しく機能するようにする必要があります。

これを行う方法に関するアイデアはありますか?

答えて

2

このようなものです。オーケー$groups

Registration.aggregate([ 
    { 
     "$group": { 
      "_id": { 
       "day": "$day", 
       "group": "$group", 
       "division": "$division", 
       "level": "$level" 
      }, 
      "count": { "$sum": 1 } 
     } 
    }, 
    { $project: { count:1, nets: { $ceil : { $divide: [ "$count" , 5 ] } } } }, 
    { 
     "$group": { 
      "_id": { 
       "day": "$_id.day", 
       "group": "$_id.group", 
       "division": "$_id.division"     
      }, 
      "count": { "$sum": "$count" }, 
      "nets": { "$sum": "$nets" }, 
      "levels": { 
       "$push": { 
        "level": "$_id.level", 
        "teams": "$count", 
        "nets" : "$nets" 
       } 
      } 
     } 
    }, 
    { 
     "$group": { 
      "_id": { 
       "day": "$_id.day", 
       "group": "$_id.group"    
      }, 
      "count": { "$sum": "$count" }, 
      "nets": { "$sum": "$nets" }, 
      "divisions": { 
       "$push": { 
        "division": "$_id.division", 
        "count": "$count", 
        "nets:": "$nets", 
        "levels": "$levels" 
       } 
      } 
     } 
    } 
]) 
+0

の残りのため$sum & $pushnets続いlevelためnetsを計算する$projectのステージを追加し、それは素晴らしいです!プロジェクトでは、最初のグループから何かを取り出し、2番目のグループで使用することができます。私はそれを他のレベルのグループに「投影する」ことができますか?私が集計について見たのは、UNIXやそれ以外のことを指すように見えるので、私はちょっと失ってしまった。 – user3561890

+0

'$ project/$ addFields'を使って各文書にフィールドを追加/上書きすることができます。 – Veeram

関連する問題