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