发布反应式集合汇总数据
Publish reactive collection summary data
我有一个集合,但不想将其全部发布给客户端,因为它很大,但是我需要发布该集合的一些统计数据(如计数、总和、平均值等)。
我不能使用 methods
,因为它们不是反应式的,而且我不能使用 publish
,因为它只适用于 cursor
。
我想创建额外的集合并将这些统计信息存储在其中,但这看起来有点奇怪。
最好的方法是什么?
解决方案
在服务器端:
Meteor.publish('myStats', function() {
var self = this;
var initializing = true;
var stats = {};
var filter = {/* Your filter if needed */};
var calcStats = function() {
stats = {stat1: 0, stat2: 0}; // Init stats
var mc = MyCollection.find(filter).fetch();
for (var i = 0; i < mc.length; i++) {
doc = mc[i];
// Here any logic to calculate stats
stats.stat1 += 1;
stats.stat2 += doc.field;
// ...
}
if (!initializing) {
return self.changed('myStats', 'stringId', stats);
}
};
MyCollection.find(filter).observeChanges({
added: calcStats, // I will recalculate all my stats
changed: calcStats, // after any changes happend
removed: calcStats
});
initializing = false;
this.added('myStats', 'stringId', stats);
return this.ready();
});
在客户端创建集合:
MyStats = new Mongo.Collection('myStats');
使用统计数据:
Meteor.subscribe('myStats');
var stats = MyStats.findOne('stringId');
喜欢的话可以用流星法。您只需要将 meteor 方法调用的结果存储在一个反应变量中,例如会话变量。
Template.templateName.onRenedered( function() {
Meteor.call("getStats", function(err, res) {
Session.set("count", res.count); // for example
}
});
您还可以查看 reactive-var 包来创建您自己的反应变量,您可以将其附加到模板而不是污染全局会话。
编辑:这可能无法解决您的非反应性问题。看看这个答案:How to 'transform' data returned via a Meteor.publish?。您可以在此处更改要发布的数据,将光标映射到较小的内容,同时添加所需的字段。
我有一个集合,但不想将其全部发布给客户端,因为它很大,但是我需要发布该集合的一些统计数据(如计数、总和、平均值等)。
我不能使用 methods
,因为它们不是反应式的,而且我不能使用 publish
,因为它只适用于 cursor
。
我想创建额外的集合并将这些统计信息存储在其中,但这看起来有点奇怪。
最好的方法是什么?
解决方案
在服务器端:
Meteor.publish('myStats', function() {
var self = this;
var initializing = true;
var stats = {};
var filter = {/* Your filter if needed */};
var calcStats = function() {
stats = {stat1: 0, stat2: 0}; // Init stats
var mc = MyCollection.find(filter).fetch();
for (var i = 0; i < mc.length; i++) {
doc = mc[i];
// Here any logic to calculate stats
stats.stat1 += 1;
stats.stat2 += doc.field;
// ...
}
if (!initializing) {
return self.changed('myStats', 'stringId', stats);
}
};
MyCollection.find(filter).observeChanges({
added: calcStats, // I will recalculate all my stats
changed: calcStats, // after any changes happend
removed: calcStats
});
initializing = false;
this.added('myStats', 'stringId', stats);
return this.ready();
});
在客户端创建集合:
MyStats = new Mongo.Collection('myStats');
使用统计数据:
Meteor.subscribe('myStats');
var stats = MyStats.findOne('stringId');
喜欢的话可以用流星法。您只需要将 meteor 方法调用的结果存储在一个反应变量中,例如会话变量。
Template.templateName.onRenedered( function() {
Meteor.call("getStats", function(err, res) {
Session.set("count", res.count); // for example
}
});
您还可以查看 reactive-var 包来创建您自己的反应变量,您可以将其附加到模板而不是污染全局会话。
编辑:这可能无法解决您的非反应性问题。看看这个答案:How to 'transform' data returned via a Meteor.publish?。您可以在此处更改要发布的数据,将光标映射到较小的内容,同时添加所需的字段。