在流星蒙戈收藏中的排除场上变换


Meteor.publish("thing", function(options) {
    return Collection.find({}, {fields: {anArray: 0}})
})

我排除了"anArray",因为它包含的用户ID并不意味着每个用户都能看到。但是,它可以包含登录用户本身,在这种情况下,用户需要知道它。

Collection = new Mongo.Collection("thing", {
    transform: function(document) {
        _.each(document.anArray, function(item) {
            item = true
        })
        return document
    }
})

上面我尝试转换集合(简化(,但由于排除了"anArray",因此根本没有定义"anArray"。

如何让用户知道他在"anArray"中,而不会损害"anArray"中的所有其他用户?(我试图在转换中做到这一点。

你可以使用我开发的软件包,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()

如本答案中所述,以下是在发布文档字段之前访问文档字段的方法:

// 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功能。

不可能

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

此外,由于服务器上的转换被忽略(请为此问题投票(,因此如果它是动态计算的,则必须在数据库中设置该字段。类似的SO问题:1,2,3。

另一种方法是定义非数据库支持的集合。查看按房间计数的示例。

最新更新