Meteor 使用嵌入的用户数据发布论坛回复

Meteor 使用嵌入的用户数据发布论坛回复,meteor,publish,Meteor,Publish,我试图发布论坛回复到一个特定的线程,但我希望这些回复文档包括关于发布它的用户的额外信息 我不想把这些额外的信息保存在回复上,而是发布一个改进的版本 我已经在客户端使用mycollection.find.map做了类似的事情,并使用map函数在每个返回的文档上嵌入额外信息,但是,Meteor publish似乎不能发布数组,只能发布光标,因此简单的map函数是不允许的 有没有办法做到这一点?可能是一个返回光标的映射函数 我没有使用Meteor.methods,所以我可以有反应性,因为有了它们,我可

我试图发布论坛回复到一个特定的线程,但我希望这些回复文档包括关于发布它的用户的额外信息

我不想把这些额外的信息保存在回复上,而是发布一个改进的版本

我已经在客户端使用mycollection.find.map做了类似的事情,并使用map函数在每个返回的文档上嵌入额外信息,但是,Meteor publish似乎不能发布数组,只能发布光标,因此简单的map函数是不允许的

有没有办法做到这一点?可能是一个返回光标的映射函数

我没有使用Meteor.methods,所以我可以有反应性,因为有了它们,我可以返回一个数组,然后像正常情况一样使用它

下面是一个失败的代码示例,但sends给出了我需要的信息:

Meteor.publishforumthread,函数线程{ return-forumreplays.find{thread:thread}.mapfunctionr{ //让我们填写关于每个回复所有者的附加数据 var owner=Meteor.users.findOne{{u id:r.owner}; 如果!所有者 return;//没有所有者没有回复。。 如果!owner.forumStats{ owner.forumStats={}; owner.forumStats.postCount=0; owner.forumStats.postLikes=0; owner.forumStats.title=新手; owner.forumStats.tag=新手; 更新{u id:owner.{u id},{$set:{forumStats:owner.forumStats}; } r、 ownerid=所有者。\u id; r、 ownerUsername=owner.username; r、 ownerPostCount=owner.forumStats.postCount; r、 ownerPostLikes=owner.forumStats.postLikes; r、 ownerTitle=owner.forumStats.title; r、 ownerTag=owner.forumStats.tag; 返回r; }; };
谢谢。

最后做了这个发现,Christian Fritz也建议:

    Meteor.publish("serverforumthread", function(thread){
    check(thread, String);

    var replies = forumReplies.find({thread: thread});
    var users = {};
    replies.map(function(r){
        users[r.owner] = r.owner;
    });
    var userids = _.map(users, function(value, key){ return value; });   
    var projectedFields = {_id:1, username:1, forumStats: 1, services: 0};    
    var usrs = Meteor.users.find({_id:{$in: userids}}, projectedFields);
    var anyUpdateToUsers = false;
    usrs.map(function(owner){
        var changed = false;
        if(!owner.username){
            owner.username = owner.emails[0].address.split("@")[0]; 
            changed = true;
        }
        //owner.forumStats = undefined;
        if(!owner.forumStats){
            owner.forumStats = {};
            owner.forumStats.postCount = 0;
            owner.forumStats.postLikes = 0;
            owner.forumStats.title = "the newbie";
            owner.forumStats.tag = "newbie";
            owner.forumStats.img = "http://placehold.it/122x122";
            changed = true;
        }
        if(changed){
            anyUpdateToUsers = true;
            Meteor.users.update({_id: owner._id}, {$set:{ forumStats:owner.forumStats }});
        }
    });  
    if(anyUpdateToUsers) // refresh it
         usrs = Meteor.users.find({_id:{$in: userids}}, projectedFields);

    usrs.map(function(owner){
        console.log(owner);
    });
    return [replies, usrs];
});
它与以下客户端配合得非常好:

Template.forumReplyOwner.helpers({
    replyOwner: function(reply){
        var owner = Meteor.users.findOne({_id: reply.owner});
        console.log(reply, owner);
        if(!owner || !owner.forumStats) return; // oh shait!
        var r = {};
        r.owner = owner._id;
        r.ownerUsername = owner.username;
        r.ownerPostCount = owner.forumStats.postCount;
        r.ownerPostLikes = owner.forumStats.postLikes;
        r.ownerTitle = owner.forumStats.title;
        r.ownerTag = owner.forumStats.tag;
        r.ownerImg = owner.forumStats.img;
        return r;
    },
    ownerImgTab: function(){
        return {src: this.ownerImg};
    }
});

然而,我现在面临另一个问题。即使我限制了我从用户集合发布的字段,它仍然发送服务字段,包含不应该发送的登录数据,想法.< /p>查看@克里斯蒂安-弗里茨回答,也见“@ AKSAT”答案,您也可以考虑将FuunMe答复和相应的用户数据一起发布,正如David Weldon在这里指出的:。我发现这些复合出版物非常强大,但很干净。然后,您将在客户端组装扩展论坛回复。