2

ユーザーが表示およびフィルタリングできるようにしたいかなり大きなドキュメント セットがあります。スピードアップするために、限られた量のドキュメントのみをクライアントに送信しています。ただし、クライアントがドキュメントをフィルタリングできるようにする必要があるため、クライアントがフィルタリングできるキーと値を送信する方法が必要です。クライアントが選択したフィルターに基づいて、ドキュメントのクエリを作成します。たとえば、次のような 2 つのドキュメントがあるとします。

{tags: ['foo'], user: 'Ken'} {tags: ['bar', 'baz'], user: 'Barbie'}

この場合、クライアントは、タグが foo、bar、および baz でフィルタリングされ、ユーザーが Ken と Barbie でフィルタリングできることを確認する必要があります。フィルターはドキュメント内のデータの単なる集約であるため、フィルターのコレクションを作成してデータベースに保存したくありません。代わりに、私は使用して遊んでいます

var Filters = new Meteor.Collection(null)

出版物の中。フィルターを作成するすべてのドキュメントに対してクエリを実行し、フィルターを Filters コレクションに挿入します。Filters コレクションで .observe を使用して、フィルターが追加されるとクライアントに送信します。

この結果、各クライアントがサーバー上に Filters コレクションを作成します。これらのコレクションのそれぞれに、{tag: 'foo', count: 3} のような約 50 ~ 400 のフィルターが含まれているとします。私には、サーバーの RAM を使い果たすことなく問題ないように思えますが、私はコンピューター科学者ではありません。これに関するご意見をいただければ幸いです。

サーバー上でフィルターを作成する方法について他のアイデアがある場合は、それも興味深いでしょう。

ありがとう!

4

1 に答える 1

2

フィールド指定子を使用して、フィルター フィールドだけでコレクション全体を公開するのはどうですか? こうすることで、フィルターだけを備えた追加のコレクションのようになり、結果では、tagフィールドを持たないドキュメントのみを表示するように選択できます。

しかし、私の意見では、より良いアイデアは、モハメドの提案と同様のことを行い、物事を少し正規化することです。タグ名と ID を含む別の Tags コレクションを持ち、タグ ID とユーザー ID を格納する TagsUsers 接続を持ちます。これにより、タグ コレクションをクライアントに公開し、タグを 1 回だけ追加/削除/編集し、サーバーで公開メソッドを簡単にフィルター処理できるため、フィルター処理がはるかに簡単になります。

// Server publish method
// Return just users that the client has filtered
Meteor.publish('users', function (tagIds) { // tags is an array of tag ids ['foo', 'baz']
    var userIds = TagsUsers.find({ tagId: { $in: tagIds } }).map(function (connector) {
        return connector.userId;
    });

    return Users.find({ _id: {$in: userIds } });
});

// Client subscribe method
Meteor.subscribe('users', Session.get('tag-filters'));

注:これはCodersClanで最初に回答されたものです。

于 2013-11-07T11:42:56.283 に答える