【问题标题】:Publish reactive collection summary data发布响应式集合摘要数据
【发布时间】:2015-09-08 05:03:48
【问题描述】:

我有一个集合,但不想全部发布给客户,因为它很大,但是我需要从这个集合中发布一些统计数据(如计数、总和、平均等)。

我不能使用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 reactive-programming meteor-publications


    【解决方案1】:

    如果您愿意,可以使用流星方法。您只需将流星方法调用的结果存储在反应变量中,例如会话变量。

    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?。您可以在此处更改要发布的数据,将光标映射到较小的位置,同时添加您需要的字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多