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。
另一种方法是定义非数据库支持的集合。查看按房间计数的示例。