我一直在寻找这个问题的答案,但遗憾的是我没有看到它会回答我的问题。我有一个看起来像这样的费用集合
{ 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}} `
感谢。
答案 0 :(得分:2)
您应该注意,您批准的解决方案要求所有数据都存储在客户端上。这是什么意思?
如果您的集合包含大约1000个甚至更多的条目,则必须先发布所有这些条目并将这些条目存储在客户端上,然后才能创建组。这需要大量的空间并且需要大量的性能。因此,如果您的集合不能被激活,那么您应该通过聚合寻找服务器端组。检查此stackoverflow-post:
修改强> 基本上,链接的文章显示了您需要的一切。我希望你在发布和订阅方面已经很常见了吗?
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 } ]