meteor合并同一集合的游标 [英] meteor merging cursors of same collection

查看:196
本文介绍了meteor合并同一集合的游标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In my social app(like as FB) I have a strange need to merge two cursors of the same collection users in one publish!

Meteor服务器打印此错误:
发布函数为集合用户返回多个游标。

Meteor server print this error: "Publish function returned multiple cursors for collection users".

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

Maybe this can not be done in Meteor 0.7.2, perhaps I'm mistaken approach. But I have seen the structure of a cursor is pretty simple as I could make a simple array merge and return back a Cursor?

CLIENT

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

SERVER

//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();
});


推荐答案

解决方案 >

SOLUTION

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();
});

这篇关于meteor合并同一集合的游标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆