0

私はコレクションを持っていますが、それが巨大であるためすべてをクライアントに公開したくありませんが、このコレクションからいくつかの統計 (カウント、合計、平均など) を公開する必要があります。

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');
4

1 に答える 1

1

必要に応じて流星法を使用できます。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? . ここで、公開するデータを変更し、必要なフィールドを追加しながら、カーソルをそれほど大きくないものにマッピングできます。

于 2015-09-07T16:25:56.143 に答える