通过在Meteor中对集合进行分组来获取总和

时间:2015-07-05 18:58:57

标签: javascript node.js mongodb dictionary meteor

我有一个包含字段的集合:numberabc

我想根据数字将集合分成三个,并为每个分组获得abc的单独总和。

我用

做了这个
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"));

它有效,但我认为代码非常难看。

我想知道是否可以通过智能映射来完成。此外,我猜它可能会有糟糕的表现。

如何优化这些总和?

1 个答案:

答案 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