1

我有两个集合,对于一些objectsparents

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和 1000objects
  • 我事先不知道我会有多少个parents/ ,也不知道每个人会引用哪些允许的字段objectsparent
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}});

在这种情况下,字段行允许将“名称”、“f1”和“f2”字段传递给客户端。

于 2013-05-28T23:48:19.373 回答