2017-05-13 12 views
0

私は集計を実行しており、元の集計方法ではSUMの合計をさらに細分化する機能を実行する方法を検討しています。私は現在、クラスターコードでグループ化された距離内の合計イベントを返します。私は合計数を各カテゴリーごとに分解したいと思います。返された集計結果内の変数の数を返します

は、私は、私は、各カテゴリのためにこれを打破するために私$groupクエリ内の余分なパラメータ{"category" : "$category"}を追加することができます承知しているので、

var events = Events.aggregate(
     [ 
      { 
      $match : { 
       "location.loc" : { 
        $geoWithin : { 
        $centerSphere : [[long,lat], milesToRadian(radius) ] 
        } 
       } 
      } 
      }, 
      { 
      $group : { 
       _id : { 'cluster_code' : "$location.cluster_code"}, 
       count : { $sum : 1 } 
      } 
      } 
     ] 
    ) 

として$groupクエリを実行することができます知っています。私は次に、私が探している正しいフォーマットを作成するためのグループ化方法を実行することができます。これは私が質問を改善できるように感じます。

私が達成しようとしているのは、SUMのカウントを各categoryのカウントにすることです。これと同様:

{ 
    "_id": { 
     "cluster_code": "FK", 
    }, 
    "Run" : 2, 
    "Swim" : 1 
    "count": 3 
    }, 

これは単一の集約クエリで可能ですか?

UPDATE

あなたは3.4.4バージョンに集約パイプラインの下に試すことができるサンプルダミーの文書

{ 
_id : "df", 
"location" : { 
    //... 
}, 
"category" : "Run" 
} 
+0

サンプルドックはどのように見えますか? – Astro

+0

上記の更新。 'category'はトップレベルの文字列です – Allreadyhome

答えて

0

$groupcluster_codeおよびcategory各グループ化のカウントを得る。

$zipcategoryキー値のペアに続いて$arrayToObjectが出力フォーマット構造を作成します。 datacluster_code & totalをプッシュする

使用$addFields

$replaceRootを使用して、data埋め込みドキュメントをトップレベルに昇格させます。

aggregate(
{$group : { 
     _id : { "cluster_code" : "$location.cluster_code", category:"$category"}, 
     count : { $sum : 1 } 
    } 
}, 
{$group : { 
     _id : "$_id.cluster_code", 
     categorycount : { $push:{category:"$_id.category", count:"$count" }}, 
     total:{$sum:"$count"} 
    } 
}, 
{$addFields:{data: {$arrayToObject:{$zip:{inputs:["$categorycount.category", "$categorycount.count"]}}}}}, 
{$addFields:{"data.cluster_code": "$_id", "data.total":"$total"}}, 
{$replaceRoot:{newRoot:"$data"}} 
) 
+0

2つのグループが仕事をして理にかなっています – Allreadyhome

関連する問題