1

objects一部との 2 つのコレクションがありparentsます。

Objects = new Meteor.Collection('objects');
Parents = new Meteor.Collection('parents');

オブジェクトにはいくつかのフィールドが含まれ、親オブジェクトを参照します。次に例を示します。

Objects.insert({ name: "o1", parent: "p1", f1: "val1", f2: "val2", f3: "val3" });
Objects.insert({ name: "o2", parent: "p2", f1: "val4", f2: "val5", f3: "val6" });

親は、クライアントに送信できるフィールドを定義します。次に例を示します。

Parents.insert({ name: "p1", allowedFields: [ "name", "f1", "f2" ] });
Parents.insert({ name: "p2", allowedFields: [ "name", "f1", "f3" ] });

すべてのオブジェクトをパブリッシュ/サブスクライブしたいのですが、許可されていないフィールドが削除された状態で受信します。

上記の例によると、クライアントで次のことを期待しています。

{ name: "o1", f1: "val1", f2: "val2" });
{ name: "o2", f1: "val4", f3: "val6" });

これを効率的に行うにはどうすればよいですか?

環境:

  • 流星
  • 私は通常100parentsと1000を持っていますobjects
  • 事前にいくつparents/objects何個あるかわからず、それぞれが参照する許可されたフィールドがわからないparent
4

2 に答える 2

2

以下をせよ...

サーバー上:

Meteor.publish('objects', function(parentName) {
    var parent = Parents.findOne({'name': parentName});
    var allowedFields = {};
    for (var i = 0; i < parent.allowedFields; i++)
        allowedFields[parent.allowedFields[i]] = 1;
    return Objects.find({ parent: parentId}, { fields: allowedFields });
});

クライアントで:

Parents.find({}).foreach(function(parent) {
    Meteor.subscribe('objects', parent.name);
});
于 2013-05-28T21:29:49.873 に答える
0

フィールド指定子を使用して、サーバーからクライアントに渡されるフィールドを制限できます。これが最も簡単な方法です。

例えば:

Objects.find({},
    {fields: {name:1, f1:1, f2:1}});

このシナリオでは、フィールド行により、'name'、'f1'、および 'f2' フィールドをクライアントに渡すことができます。

于 2013-05-28T23:48:19.373 に答える