1

Meteorでメッセージングアプリを作成したい(authブランチを使用)。メッセージコレクションがあり、各ドキュメントには一連の応答ドキュメント(「応答」)があります。サイドバーには、メッセージコレクションのさまざまなビューがあります。各ビューには、Meteor.publish('messages')...メソッドへの引数として提供される「クエリ」フィールドがあります。

ここまでは順調ですね。ビューをクリックすると、ページの主要部分にクエリに一致するメッセージのリストが表示されます。メッセージごとに、現在のユーザーが最後にメッセージを開いたときよりも新しい返信がある場合、または彼女がメッセージを開いたことがない場合は、太字で示します。これを行うには、各メッセージの「read_by」フィールドを維持します。このフィールドには、{user_id、...、read_at:...}レコードの配列が含まれています。これも美しく機能します。

問題は、サイドバーの各ビューに、現在選択されているビューだけでなく、各ビューの未読メッセージの数(前の段落のロジックによる)を示すバッジを表示する必要があることです。

どうすればこれを解決できますか?私の知る限り、これは、Messagesコレクションに対して多数のライブクエリを維持する必要があることを意味します。同時に、クライアントがメッセージコレクション全体をサブスクライブすることはできません。何百万ものドキュメントを保持していると仮定しましょう。サーバー上のDBコレクションにあるドキュメントの数に関係なく、クライアントはスナッピーなままである必要があります。

これには別のスキーマ設計が必要だと思いますが(これは問題ではありません)、私にはよくわかりません。

4

1 に答える 1

3

2つの選択肢があると思います。

より簡単なオプション(おそらく最も効率的ではありません)は、関心のあるすべての異なるクエリをサブスクライブすることです。

 _.each(queries, function(query) {
   Meteor.subscribe('messages', query);
 })

また、メッセージが必要な場合は、同じクエリを使用して、関心のあるメッセージのみを選択します。

 Template.queryView.messages = function() { 
   return Messages.find(queries[Session.get('currentQueryNo')]);
 }

明らかに、必要なカウントを行うことができます。

もう1つの方法は、手動で設定された特別なカウントコレクションを公開することです。まず、ドキュメントの公開counts-by-roomセクションの例と非常によく似た操作を行い、次にクライアント側で次のような操作を行います。

 var Counts = new Meteor.Collection('counts');
 _.each(queries, function(query) {
   Meteor.subscribe('counts-by-query', query);
 })

の各サブスクリプションcounts-by-queryは、カウントコレクションに1つのレコードを保持します。

お役に立てば幸いです。

于 2012-10-06T00:16:14.030 に答える