2017-02-03 12 views
0

私は、コメントコレクションとページコレクションを持っています。コメントはページに属します。ユーザーはコメントをアップヴォートすることができ、ページに属するコメントのすべての投票の総計を表示したい。これを行うには何が良い方法でしょうか?コレクションの集計値を格納するのにAutoValueを使うべきですか?

私は、合計をAutoValueとしてページコレクション内に保持することを考えていました。 AutoValueの再計算を時々トリガーする方法がありますか?私は合計をリアルタイムで更新する必要はなく、5分ごとに1回で十分です。

これは悪い考えですか?テンプレート内でReactiveVarを使用して計算などを行う方が良いでしょうか?

編集:セットアップには特別なことはありません。単純に数字の 'votes'属性を持つコメントコレクションと、投票を数えなければならない数値の自動点数 'score'を持つページコレクション。 ページ:

Collections.Pages = new Mongo.Collection("pages"); 

var PageSchema = new SimpleSchema({ 
    name: { 
     type: String, 
     min: 1 
    }, 
    score: { 
     type: Number, 
     autoValue: function (doc) { 
       var maxValue = 1; 
       Collections.Comments.find({ pageId: doc.pageId }).map(function(mapDoc){ 
        maxValue += mapDoc.votes; 
       }); 
       return maxValue; 
     } 
    }, 

コメント:

Collections.Comments = new Mongo.Collection("comments"); 

var CommentSchema = new SimpleSchema({ 
    pageId: { 
     type: String 
    }, 
    name: { 
     type: String, 
     optional: true 
    }, 
    votes: { 
     type: Number, 
     label: 'Total Votes', 
     defaultValue: 0 
    }, 
+0

スキーマとパブリッシャーのコードを投稿できますか? – zim

+0

編集をご覧ください。パブリッシャーは投稿するだけの価値がありません。今のところ、投稿とそのコメントが返されます。 – Cos

答えて

2

多分、時限/定期的に再計算する別の方法は、単純に他のコレクションの変化に応答して、1つのコレクションに値を再計算することがあります。あなたはあなたがを必要としないと言っていたのですが、リアルタイムであればリアルタイムですが、あなたは気にしませんでした。

私は同様の問題を抱え、Meteor Collection Hooksパッケージ(https://github.com/matb33/meteor-collection-hooks参照)を使用しました。

例:

Collection.comments.after.update(function(userId, doc) { // make update to aggregated value in Collections.pages });

+0

オブザーバーを使ってコレクションの変更をキャッチしました(新しいパッケージを追加することなく)。ヒントをありがとう! – Cos

0

私は似た何かをした:私はコメントでニュース項目を持っていた、と私はすべてのコメントを公開したO/Wニュース項目ごとにコメントの数を追跡したかったです。

ニュースにコメントカウントフィールドを指定しました。私はコメントを追加したり削除したりするためのメソッドを持っていました。その処理の一環として、関連するNewsアイテムを調べ、カウントを増減しました。

あなたのスキーマソリューションでは、autoValueをトリガする明確な方法がないことがわかります。 (それは、autoValueの面白い使い方です、btw、私は将来の使用のためにそれを念頭に置いておく必要があります)。

ので、私はあなたがこれらの選択肢が残されていると思う:

  1. は、投票のためにupvote/downvoteメソッドを作成します。メソッドハンドラーでは、合計投票の計算を行い、更新された値をポストとともに保管します。これは私がNews/Commentsで行ったことに似ています。

  2. Davidが示唆したように、コレクションフックを使用して#1と同様のことを行います。私はコレクションフックを使用していますが、通常は自分がやりたいことに明確なフックを持っていません。それはキャッチオール、または完全に制御できないものを排除した処理です。

  3. 公開してください。ページを公開するときは、投票数を参照し、パブリッシュ・オブジェクトに単に動的に追加します。投票が変更されると、これはページを再公開しないので、その反応性を失うことに注意してください。あなたは定期的な更新であなたが大丈夫だったことを示しました。

これを更新することは、出版社に再度実行させる必要があるため、ややこしいでしょう。例えば登録解除と再登録によって。

私はあなたの問題を理解したところで、私は提示された順序でそれらが好きです。 #3は最低限の実行可能性を感じますが、あなたがやっている何かに合っているかどうかについて言及します。

関連する問題