元のドキュメントへのアクセスを必要とする変換を適用した後、公開機能からクライアントに送信されるフィールドの数を制限する必要があります。
私は基本的に、潜在的に巨大な配列をクライアントに送信することを避け、一連のチェックを実行して、処理する適切なオブジェクトを返すようにしています。
Heres私が今持っている機能です - それは機能しますが、私が望む方法ではなく、基本的に機能を観察するために与えられたフィールドを制限します。観察/変換後に投影を追加する方法はありますか?
Meteor.publish('network', function() {
var self = this;
// get the user values initially
var user = Meteor.users.findOne(self.userId);
var followingUsers = user.following ? user.following.users || [] : [];
var followingChannels = user.following ? user.following.channels || [] : [];
var transformMedia = function(doc) {
// get the user each time to keep this publication reactive
votesUp = doc.votes ? doc.votes.up || [] : [];
votesDown = doc.votes ? doc.votes.down || [] : [];
favourites = doc.votes ? doc.votes.favourites || [] : [];
doc.userActions = {
votedUp: _.contains(votesUp, doc._id) ? 1 : 0,
votedDown: _.contains(votesDown, doc._id) ? 1 : 0,
isFavourite: _.contains(favourites, doc._id) ? 1 : 0,
played: _.contains(doc.played, self.userId) ? 1 : 0,
};
return doc;
};
var networkQuery = Media.find({
$and: [
{
$and: [
{processedAt: { $exists: true} },
{processedStatus: 'successful'},
{publishStatus: 'published'}
]
},
{
// if created by this user, user they follow or channels they subscribe to
$or: [
{createdBy: self.userId },
{createdBy: { $in: followingUsers} },
{channels: { $in: followingChannels} },
]
}
// TODO : add not banned or trashed once implemented
]
}, mediaModifiers).observe({
added: function(doc) {
self.added('media', doc._id, transformMedia(doc));
},
changed: function(doc, oldDoc) {
self.changed('media', doc._id, transformMedia(doc));
},
removed: function(doc) {
self.removed('media', doc._id, transformMedia(doc));
},
});
self.onStop(function() {
networkQuery.stop();
});
self.ready();
});