Mongodb Aggregation group by on more field

时间:2017-10-24 17:55:43

标签: mongodb mongoose mongodb-query aggregation-framework

我正在对集合应用聚合,我想按多个字段进行分组。管道中的所有计算都是相同的。我希望看到按不同领域分组的结果。

我正在使用的字段的可能值:

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
}

我正在检查组中的所有条件。我不确定这是否是最好的方法。一个选项是通过应用于单个字段多次运行此聚合,但这会导致性能问题并重复相同的查询。

由于性能原因,我无法使用mapReduce。

这是最好的方法吗?或任何其他方法?

1 个答案:

答案 0 :(得分:0)

根据提供的预期结果,您可以安全地说要获得总计。在这种情况下,您应该按 null 而不是"result"对文档进行分组,因为我们不知道将来Mongo可能意味着什么。

我认为你问题的问题在于你使用" group by" term,但实际上你的意思是计算字段包含一些累加器表达式的值。

嗯,你这样做的方式对我来说似乎没问题(除了 null / "result"之外)。