解析云代码 - 使用关系数据嵌套多个查询

时间:2015-02-10 08:58:38

标签: javascript parse-platform

我正在使用Parse的Cloud Code编写一个返回的方法和包含两个子数组的数组。 on array是一个团队数组,另一个是包含这些团队成员数组的数组。目的是获取团队及其团队成员的列表。阵列将传递到iOS前端进行显示。

我的数据目前是结构化的,因此有一个Team对象可以有多个用户,但用户只能有一个团队。

这是我现在的云功能:

var arrayOfUsers = [];
var arrayOfTeamMembers = [];
var arrayOfTeams = [];

Parse.Cloud.define("GetTopTeams", function(request, response) {
    var query = new Parse.Query("Teams");
    arrayOfTeams = [];
    arrayOfTeamMembers = [];
    fullArray = [];
    query.find().then(function(teams) {
        //returns a raw list of teams
        return teams;
    }).then(function(teams) {
        arrayOfUsers = [];
        teams.forEach(function(team) {
            //add team to subArray1
            arrayOfTeams.push(team);
            //searches for all users within the team
            var memberQuery = new Parse.Query(Parse.User);
            memberQuery.equalTo('team', team);           
            memberQuery.find().then(function(tMember) {
                //adds the team member to initial array
                arrayOfUsers.push(tMember);
            });
        }).then(function(){
            //pushes the finished array to the team member array
            return arrayOfTeamMembers.push(arrayOfUsers);
        }).then(function() {
            return arrayOfTeams;
        });
    }).then(function() {
        return response.success([arrayOfTeams, arrayOfTeamMembers]);
    });
});

我能够填充arrayOfTeams但是获得arrayOfTeamMembers证明是困难的。是否有更好的方法来嵌套它们?我尝试过承诺但不熟悉Javascript承诺。我发现了类似的帖子但没有解决我遇到的问题。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以使用Underscore。它已在Cloud Code中提供。使用它,您只需要一个查询。你可以这样写:

var memberQuery = new Parse.Query(Parse.User);
memberQuery.exists("team");
memberQuery.include("team");
memberQuery.find().done(function(users){
    var usersGroupedByTeam = _.groupBy(users, function(user) {
        return user.get("team").id;
    });
    var arrayOfTeams = _.chain(users)
        .map(function(user) { return user.get("team"); })
        .uniq(function(team) { return team.id; })
        .value();
    response.success({
        arrayOfTeams: arrayOfTeams, 
        usersGroupedByTeam: usersGroupedByTeam
    });
}).fail(function(error){
    //error handle
    response.error(error.message);
});

我建议你将结果作为对象而不是数组返回。在最终结果中,您将拥有小组(arrayOfTeams),并按小组(usersGroupedByTeam)对您的用户进行分组。

要检索特定团队的用户,您将使用usersGroupedByTeam["A_TEAM_ID"]

注意:请记住,默认情况下,Parse.Query只会带来100条记录。您可以使用Parse.limit更改它,但不要忘记考虑这一点。