2015-02-10 82 views
0

我正在使用Parse的Cloud代碼來編寫一個將返回的方法和包含兩個子數組的數組。數組是一個團隊數組,另一個是包含這些團隊成員數組的數組。目的是獲得團隊及其團隊成員名單。數組將被傳遞到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

您可以使用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來改變它,但不要忘記考慮這一點。

+0

謝謝奧斯卡!代碼似乎工作,除了得到返回的teamId爲空。 user.get(「團隊」)將返回關係,但不是實際的Team對象。有什麼建議麼? – 2015-02-10 19:00:59

+0

多米尼克,當你使用'memberQuery.include(「團隊」)'你說給解析帶來完整的對象(不僅是關係,或ID)。所以這個代碼應該工作,只要你有一個所有用戶的團隊。實際上,當我們使用'memberQuery.exists(「team」)',我們確保只有擁有團隊的用戶纔會被查詢。所以,沒有理由的錯誤。 – 2015-02-20 20:38:49

+0

我使用類似的模型在我的環境中進行了測試,並且工作正常。也許如果你給我更多關於錯誤發生的信息,我可以幫你解決。 – 2015-02-20 20:44:39