我有一个包含字段的集合:number
,a
,b
,c
。
我想根据数字将集合分成三个,并为每个分组获得a
,b
和c
的单独总和。
我用
做了这个function sumList(amountList) {
return _.reduce(amountList, function(sum, amount) {
return sum + amount;
}, -1);
}
// cursors
var group1 = Groups.find({ number: { $lte: 32 } }).fetch();
var group2 = Groups.find({ number: { $gte: 33, $lte: 70 } }).fetch();
var group3 = Groups.find({ number: { $gte: 71 } }).fetch();
// sums for group1
var group1SumA = sumList(_.pluck(group1, "a"));
var group1SumB = sumList(_.pluck(group1, "b"));
var group1SumC = sumList(_.pluck(group1, "c"));
// sums for group2
var group2SumA = sumList(_.pluck(group2, "a"));
var group2SumB = sumList(_.pluck(group2, "b"));
var group2SumC = sumList(_.pluck(group2, "c"));
// sums for group3
var group3SumA = sumList(_.pluck(group3 "a"));
var group3SumB = sumList(_.pluck(group3, "b"));
var group3SumC = sumList(_.pluck(group3, "c"));
它有效,但我认为代码非常难看。
我想知道是否可以通过智能映射来完成。此外,我猜它可能会有糟糕的表现。
如何优化这些总和?
答案 0 :(得分:0)
使用 aggregation framework ,其中包含 $match
管道运算符,以过滤$_SERVER['HTTP_HOST']
字段上的集合。然后, $group
管道步骤将所有已过滤的输入文档分组,并将累加器表达式 $sum
应用于每个字段以获取总和。
你的管道看起来像这样:
number
您可以添加 meteorhacks:aggregate package 来实现Meteor中的聚合:
使用
添加到您的应用中var pipeline = [
{
"$match": { "number": { "$lte": 32 } } /* group1 filter */
},
{
"$group": {
"_id": 0,
"sumA": { "$sum": "$a" },
"sumB": { "$sum": "$b" },
"sumC": { "$sum": "$c" }
}
}
];
由于此程序包在Mongo.Collection实例上公开 meteor add meteorhacks:aggregate
方法,因此您可以调用该方法以获取具有总和的文档的结果数组。例如
.aggregate