アプリケーションによって異なりますが、おそらく空でない文字列をパブリッシャーに送信し、パブリッシャーはその文字列を使用してユーザー コレクションで一致する名前を検索します。例えば:
Meteor.publish('usersByName', function(search) {
check(search, String);
// make sure the user is logged in and that search is sufficiently long
if (!(this.userId && search.length > 2))
return [];
// search by case insensitive regular expression
var selector = {username: new RegExp(search, 'i')};
// only publish the necessary fields
var options = {fields: {username: 1}};
return Meteor.users.find(selector, options);
});
フィールドを制限する理由については、よくある間違いも参照してください。
パフォーマンス
Meteor は、各クライアントが各パブリッシャーに対して持っている現在のドキュメント セットを追跡するのに十分賢いです。パブリッシャーが再実行すると、セット間の差分のみを送信することがわかっています。したがって、上記の状況はすでに対処されています。
- ユーザーを購読していた場合: 1,2,3
- 次に、ユーザー 2、3、4 のサブスクリプションを再開しました
- サーバーは
removed
1 のメッセージを送信し、4 の追加メッセージを送信します。
再実行する前にサブスクリプションを停止した場合、これは発生しないことに注意してください。
removed
私の知る限り、単一のサブスクリプションのパラメーターを変更するときにメッセージを回避する方法はありません。2 つの可能な (しかしトリッキーな) 代替案を考えることができます。
以前のすべての検索クエリの共通部分を蓄積し、購読時にそれを使用します。たとえば、ユーザーが を検索して{height: 5}
から を検索した場合、{eyes: 'blue'}
で購読できます{height: 5, eyes: 'blue'}
。これをクライアントに実装するのは難しいかもしれませんが、最小限のネットワーク トラフィックで目的を達成できるはずです。
アクティブなサブスクリプションを蓄積します。ユーザーが検索を変更するたびに既存のサブスクリプションを変更するのではなく、新しいドキュメント セットの新しいサブスクリプションを開始し、サブスクリプション ハンドルを配列にプッシュします。テンプレートが破棄されたら、すべてのハンドルを反復処理して呼び出す必要がありstop()
ます。これは機能するはずですが、より多くのリソース (ネットワークとサーバーのメモリ + CPU の両方) を消費します。
これらのソリューションのいずれかを試す前に、それらを使用せずに最悪のシナリオをベンチマークすることをお勧めします。私の主な懸念は、かなり厳格な管理を行わないと、連続した検索の後にユーザー コレクション全体を公開してしまう可能性があることです。