2017-10-24 14 views
0

コレクションに集計を適用していますが、複数のフィールドでグループ化したいと思います。すべての計算はパイプラインで同じです。結果をさまざまな分野でグループ化してみたいと思います。私が使用していますフィールドのMongodb 1つ以上のフィールドでの集約グループ

可能な値:

ageCategory -> 10, 20, 30 40 
sex -> Male, Female 
type -> A,B,C,D,E 
stage -> I, II, III, IV 

これは、今私はこれをやっている方法です:データの簡易表現

mongoose.connection.db.collection("collection").aggregate([ 
      { $match: //match conditions }, 
      { $project: { 
        ageCategory: 1, 
        sex: 1, 
        type: 1, 
        stage: 1, 
        //other fileds 
       } 
      }, 
      { $match: //match conditions } , 
      { $project: { 
        ageCategory: 1, 
        sex: 1, 
        type: 1, 
        stage: 1, 
        //other fileds 
       } 
      }, 
      { 
       $group: { 
        _id: "result", 
        age10: { $sum: { $cond:[//condition for ageCategory 10,1,0] } }, 
        age20: { $sum: { //condition for ageCategory 10 } }, 
        //other age categories 
        male: { $sum: { //condition for male } }, 
        female: { $sum: { //condition for female } },       
        typeA: { $sum: { //condition for type A } }, 
        typeB: { $sum: { //condition for type B } }, 
        //other conditions 
       } 
      } 
     ]).toArray(function (err, result) { 
      //final computations 
     }); 

と期待される結果:(いくつかがあります一致やプロジェクトステートメントで発生する計算は無視されます)。

[{ 
    ageCategory: "10", 
    sex: "Male", 
    type: "A", 
    stage: "I", 
    sub:[ 
     {} 
    ], 
    //other sub documents that are used in the pipeline 
}, 
{ 
    ageCategory: "20", 
    sex: "Male", 
    type: "B", 
    stage: "I", 
    sub:[ 
     {} 
    ], 
    //other sub documents that are used in the pipeline 
}] 

期待される結果:

{ 
    age10:1, //count of sub with ageCategory as 10 
    age20:1, 
    //other count by age. It is okay to ignore the ones with zero count. 
    male: 2, 
    typeA: 1, 
    typeB: 1, 
    stageI: 2 
} 

私はグループのすべての条件をチェックしています。これが最良の方法であるかどうかはわかりません。 1つの選択肢は、個々のフィールドに適用してグループでこの集約を複数回実行することですが、それはパフォーマンスの問題を引き起こしており、同じクエリの繰り返しも発生しています。

パフォーマンス上の理由からmapReduceを使用することはできません。

これを行う最も良い方法ですか?または任意の代替アプローチ?

+0

あなたの正確な質問は何ですか? – dnickless

+0

が私の質問を更新しました。ありがとう – user3731783

+0

入力データと予想される出力の簡単な例を教えてください。 – cbartosiak

答えて

0

合計を取得したいと考えています。このような場合は、将来的にMongoにとって何が意味するのかわからないので、文書をヌルでグループ化し、"result"ではなくグループ化する必要があります。

私はあなたの質問の問題は、あなたが "グループ"用語を使用していると思うが、実際にいくつかのアキュムレータ式の値を保持するフィールドを計算することを意味します。

これを行った方法は、私にとっては問題ありません(ヌル/"result"ものを除いて)。

+0

です。あなたはgroupbyについて正確です。しかし、$ groupと同じ条件を使用して条件に対して$ projectを使用する利点は何ですか?私の既存のコードでは期待通りの結果を得ています。 – user3731783

+0

私は、キーポイントに焦点を当て、人々を誤解させないように私の答えを編集しました。あなたが持っているインラインよりも遅いかもしれないので、 '$ group'の前に' $ project'を使わなければならない場合は、 – cbartosiak

関連する問題