流星合并同一集合的游标

时间:2014-03-23 01:23:15

标签: javascript collections merge meteor cursor

在我的社交应用程序中(比如FB),我很奇怪需要在一次发布中合并同一个集合用户的两个游标!

Meteor server打印此错误: “发布函数为集合用户返回了多个游标”。

也许这不能在Meteor 0.7.2中完成,也许我错了方法。 但我已经看到游标的结构非常简单,因为我可以进行简单的数组合并并返回一个Cursor?

客户端

Meteor.subscribe('friendById', friend._id, function() {
    //here show my friend data and his friends
});

服务器

//shared functions in lib(NOT EDITABLE)
getUsersByIds = function(usersIds) {
    return Meteor.users.find({_id:  {$in: usersIds} },
                            {
                                fields: {   // limited fields(FRIEND OF FRIEND)
                                    username: 1,
                                    avatar_url: 1
                                }
                            });
};
getFriendById = function(userId) {
    return Meteor.users.find(userId,
                            {
                                fields: {   // full fields(ONLY FOR FRIENDS)
                                    username: 1,
                                    avatar_url: 1,
                                    online: 1,
                                    favorites: 1,
                                    follow: 1,
                                    friends: 1
                                }
                            });
};

Meteor.publish('friendById', function(userId) { //publish user data and his friends

    if(this.userId && userId)
    {
        var userCur = getFriendById(userId),
            userFriends = userCur.fetch()[0].friends,
            retCurs = [];

        //every return friend data
        retCurs.push( userCur );

        //if user has friends! returns them but with limited fields:

        if(userFriends.length > 0)
            retCurs.push( getUsersByIds(userFriends) );

        //FIXME ERROR "Publish function returned multiple cursors for collection users"

        return retCurs;     //return one or more cursor
    }
    else
        this.ready();
});

2 个答案:

答案 0 :(得分:4)

请参阅bold red text in the documentation

  

如果在数组中返回多个游标,则它们当前必须全部来自不同的集合。

smart-publish个软件包,可以在发布时添加此功能,以管理同一集合上的多个游标。这是相对较新的。

使用' this.added',' this.removed'和' this.changed'手动管理游标。在发布内部。

答案 1 :(得分:1)

<强>解

Meteor.publish('friendById', function(userId) {

    if(this.userId && userId)
    {
        var userCur = getFriendById(userId),  //user full fields
            userData = userCur.fetch()[0],
            isFriend = userData.friends.indexOf(this.userId) != -1,
            retCurs = [];

        //user and his friends with limited fields
        retCurs.push( getUsersByIds( _.union(userId, userData.friends) ));

        if(isFriend)
        {
            console.log('IS FRIEND');

            this.added('users',userId, userData);   //MERGE full fields if friend
            //..add more fields and collections in reCurs..
        }

        return retCurs;
    }
    else
        this.ready();
});