转换流星Mongo Collection中的排除字段

时间:2015-02-07 22:57:22

标签: meteor publish-subscribe

Meteor.publish("thing", function(options) {

    return Collection.find({}, {fields: {anArray: 0}})
})

我排除" anArray"因为它包含不希望每个用户看到的用户标识。但是它可能包含登录用户本身,在这种情况下,用户需要知道它。

Collection = new Mongo.Collection("thing", {
    transform: function(document) {

        _.each(document.anArray, function(item) {

            item = true
        })

        return document
    }
})

上面我尝试转换集合(简化),但因为" anArray"被排除在外," anArray"根本没有定义。

我怎样才能让用户知道他在" anArray"在不损害" anArray&#34 ;?的所有其他用户的情况下(我试图在变换中这样做。)

3 个答案:

答案 0 :(得分:1)

您可以使用我开发的软件包meteor-middleware。它为此提供了一个很好的可插拔API。因此,您可以将它们堆叠在另一个上,而不仅仅是提供转换。这允许代码重用,权限检查(如删除或聚合基于权限的字段)等。

例如,对于您的特定问题,您可以(在CoffeeScript中):

thing = new PublishEndpoint 'thing', (options) ->
  Collection.find {}

class HideAnArrayMiddleware
  added: (publish, collection, id, fields) =>
    fields.anArray = _.intersection fields.anArray, [publish.userId] if fields.anArray
    publish.added collection, id, fields

  changed: (publish, collection, id, fields) =>
    fields.anArray = _.intersection fields.anArray, [publish.userId] if fields.anArray
    publish.changed collection, id, fields

thing.use new HideAnArrayMiddleware()

答案 1 :(得分:0)

不可能包含或排除数组的元素,因此最好的办法是在文档中为数组中的用户定义一个显式的布尔字段。

此外,由于忽略了服务器上的转换(请投票给this issue),如果动态计算,则必须在数据库中设置该字段。类似的SO问题:123

另一种方法是定义非数据库支持的集合。看看counts-by-room example

答案 2 :(得分:0)

this answer中所述,以下是发布文档字段之前的访问方式:

// server: publish the rooms collection
Meteor.publish("rooms", function () {
  var self = this;
  var handle = Rooms.find({}).observeChanges({
    added:   function(id, fields) { self.added("rooms", id, fields); },
    changed: function(id, fields) { self.changed("rooms", id, fields); },
    removed: function(id)         { self.added("rooms", id); },
    }
  });
  self.ready();
  self.onStop(function () { handle.stop(); });
});

在你的情况下,也许你可以这样做:

added: function(id, fields) { 
    if (fields.anArray)
        if (fields.anArray.indexOf(self.userId) !== -1)
            fields.anArray = [self.userId];
        else
            delete fields.anArray;
    self.added("rooms", id, fields); 
},

您还必须以类似的方式处理changed功能。