场地流星集团及其总和

时间:2014-07-14 04:58:08

标签: meteor aggregate

我一直在寻找这个问题的答案,但遗憾的是我没有看到它会回答我的问题。我有一个看起来像这样的费用集合

 { subcategory: 'Category-1', amount: 320 },
 { subcategory: 'Category-2', amount: 148 },
 { subcategory: 'Category-1', amount: 500 },
 { subcategory: 'Category-3', amount: 672 },
 { subcategory: 'Category-3', amount: 196 },
 { subcategory: 'Category-1', amount: 298 },
... etc

我希望通过我的表格在我的摘要报告中显示

     **Category Name**         **Amount**

     1. Category-1                 1118      
     2. Category-2                 148
     3. Category-3                 868

然后我将在我的表模板上呈现这些数据

{{#each expensesentries}}
  <tr>
     <td>{{category}}</td>
     <td>{{formatAmount amount}}</td>
  </tr>
{{/each}} `

感谢。

2 个答案:

答案 0 :(得分:2)

您应该注意,您批准的解决方案要求所有数据都存储在客户端上。这是什么意思?

如果您的集合包含大约1000个甚至更多的条目,则必须先发布所有这些条目并将这些条目存储在客户端上,然后才能创建组。这需要大量的空间并且需要大量的性能。因此,如果您的集合不能被激活,那么您应该通过聚合寻找服务器端组。检查此stackoverflow-post:

Aggregation via meteor

修改 基本上,链接的文章显示了您需要的一切。我希望你在发布和订阅方面已经很常见了吗?

Meteor.publish("expensesentries", function (args) {
    var sub = this;
    var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

    var pipeline = [
        { $group: {
            _id: subcategory,
            count: { $sum: amount }
        }}
    ];

    db.collection("server_collection_name").aggregate(        
        pipeline,

        Meteor.bindEnvironment(
            function(err, result) {
                _.each(result, function(e) {
                  sub.added("client_collection_name", Random.id(), {
                    category: item._id,
                    amount: item.count
                  });
                });
                sub.ready();
            },
            function(error) {
                Meteor._debug( "Error doing aggregation: " + error);
            }
        )
    );
});

Check mongodb aggregation pipeline

如果您使用的是铁路由器,那么您应该在那里订购。

  waitOn: function () {
    return [Meteor.subscribe('expensesentries')];
  },

在你的模板中:

Template.myTemplate.helpers({
  expensesentries: function() {
    return client_collection_name.find();
  }
});

此查询也可以在您的铁路由器数据回调中定义。 不要指望这个开箱即用。阅读铁路由器,mongodb聚合手册,并尝试了解最新情况。快乐的编码:)

答案 1 :(得分:0)

可能有一种更优雅的方式来做到这一点,但尝试一下:

Template.myTemplate.helpers({
  expensesentries: function() {
    var subs = {};
    Expenses.find().forEach(function(e) {
      if (subs[e.subcategory] == null)
        subs[e.subcategory] = 0;
      subs[e.subcategory] += e.amount;
    });

    var results = [];
    _.each(subs, function(value, key) {
      results.push({category: key, amount: value});
    });

    return results;
  }
});

第一部分按类别将金额汇总到一个对象中。所以subs看起来像是:

{ 'Category-1': 1118, 'Category-2': 148, 'Category-3': 868 }

第二部分构建一个数组(results),其中包含模板所需的键值对。完成后,它应该看起来像:

[ { category: 'Category-1', amount: 1118 },
  { category: 'Category-2', amount: 148 },
  { category: 'Category-3', amount: 868 } ]