コレクションに集計を適用していますが、複数のフィールドでグループ化したいと思います。すべての計算はパイプラインで同じです。結果をさまざまな分野でグループ化してみたいと思います。私が使用していますフィールドの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を使用することはできません。
これを行う最も良い方法ですか?または任意の代替アプローチ?
あなたの正確な質問は何ですか? – dnickless
が私の質問を更新しました。ありがとう – user3731783
入力データと予想される出力の簡単な例を教えてください。 – cbartosiak