我正在对集合应用聚合,我想按多个字段进行分组。管道中的所有计算都是相同的。我希望看到按不同领域分组的结果。
我正在使用的字段的可能值:
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。
这是最好的方法吗?或任何其他方法?
答案 0 :(得分:0)
根据提供的预期结果,您可以安全地说要获得总计。在这种情况下,您应该按 null 而不是"result"
对文档进行分组,因为我们不知道将来Mongo可能意味着什么。
我认为你问题的问题在于你使用" group by" term,但实际上你的意思是计算字段包含一些累加器表达式的值。
嗯,你这样做的方式对我来说似乎没问题(除了 null / "result"
之外)。