2012-12-15 2 views
5

나는 점수 판에서 사용자 등급을 결정할 때 다음과 같은 기능을 사용하고 있습니다. 그 기준에 부합 1000 개 이상의 항목이있는 경우클라우드 코드 파싱 한도 1000이 연쇄로 극복 했습니까?

Parse.Cloud.define("getUserGlobalRank", function(request, response) 
{ 
    var usernameString = request.params.username; 
    var scoreAmount = request.params.score; 

    var globalRankQuery = new Parse.Query("scoreDB"); 
     globalRankQuery.greaterThanOrEqualTo("score",scoreAmount); 
     globalRankQuery.descending("score"); 
     globalRankQuery.limit("1000"); 
     globalRankQuery.count(
     { 
     success: function(count); 
     { 
      response.success(count);     
     }, 

.........

그러나이 정확한 응답을 제공하지 않습니다. 이후에 .count를 수행 할 수있는 .find 메소드 세트를 함께 연결하고자합니다. 아무도 내가 이것을 어떻게 달성 할 수 있을지 전혀 모른다. 위대한 코드 예제를 제공 할 수 있다면!

많은 감사, 제임스

+0

또한 사용중인 서비스에 대한 참조를 제공하십시오. 누군가가 당신을 도울 수 있습니다. –

+0

파스 (Parse)라고합니다. www.parse.com – JamesLCQ

답변

3

Parse.Query.count()는 Parse.com 1000 쿼리 제한의 영향을받지 않습니다.

따라서 쿼리와 일치하는 항목 수에 관계없이 정확한 개수가 반환됩니다.

예 :

var userQ = new Parse.Query('_User'); 
userQ.count({success:function(count){console.log(count)}}); 
> 1512 

var userQ = new Parse.Query('_User'); 
userQ.limit(100); 
userQ.count({success:function(count){console.log(count)}}); 
> 1512 

보너스 포인트 - .limit()는 매개 변수, 코드에서와 같이하지 문자열로 숫자를합니다. 수를 사용하는 경우 https://www.parse.com/docs/js/symbols/Parse.Query.html#limit

HTH

+0

안녕하세요, 감사합니다. 내 코드 스 니펫은 분명하지 않습니다. 문제는 실제로 표준 구문 분석 쿼리가 1000 개로 제한된다는 것입니다. 이보다 많은 레코드가 필요한 경우 질문입니다. 1100이 있다고 가정 해 봅시다. 카운트를 한 다음 두 개의 쿼리를 실행할 수 있습니다 (두 번째 쿼리는 1000 건너 뛰기). 내 질문은 다음 두 결과를 단일 결과 개체로 결합하는 방법입니다. 많은 고마움, 제임스 – JamesLCQ

+0

그건 아주 간단해야합니다 - 밑줄 JS의 .union()을 사용하여 두 개 이상의 결과 배열을 결합 할 수 있습니다. [http://underscorejs.org/#union] – Meirion

+0

1000의 제한이 계산에 적용되지 않습니까? 문서에 따르면 그렇지만이 문제를 해결하는 방법이 있어야합니다. 1000 개가 넘는 개체에서 개인적으로 사용한 횟수를 사용했는지 궁금합니다. –

3

은 조심하십시오. 1000 개가 넘는 객체가있는 클래스의 경우 카운트 작업은 시간 초과로 인해 제한됩니다. 일상적으로 시간 초과 오류가 발생하거나 대략적인 결과 만 반환 할 수 있습니다. 따라서 이러한 종류의 카운트 작업을 피하기 위해 응용 프로그램을 설계하는 것이 좋습니다. 나는 보통과 같이 스킵 매개 변수를 사용 : 그것은 getUserGlobalRank에 연속 통화에서 함수 매개 변수를 사용하여 카운트를 추적으로

Parse.Cloud.define('getUserGlobalRank', function(request, response) { 

var usernameString = request.params.username; 
var scoreAmount = request.params.score; 
var skip = (request.params['skip']) ? request.params.skip : 0; 

if (skip == 0 || !window['results']) { window['results'] = []; } 

var qry = new Parse.Query('scoreDB'); 
qry.greaterThanOrEqualTo('score', scoreAmount); 
qry.descending('score'); 
qry.limit(1000); 
qry.skip(skip); 
qry.find({ 
    success: function (results) { 
     if (results.length > 0) { // got results.. 
      window.results = window.results.concat(results); 

      // Call the function again 
      var params = request.params; 
      params['skip'] = window.results.length; 
      request.params = params; 
      Parse.Cloud.run('getUserGlobalRank', request, response); 

     } else { // we're done here 
      response.success(window.results); 
     } 
    }, 
    error: function (err) { 

    } 
}); 
}); 
+0

카운트에 1000이라는 제한이 있습니까? 나는 문서가 그것이 말하는 것을 안다. 그러나 아래 대답하는 사람은 그것이 적용되지 않는다고 말한다. 개인적으로 문제가 발생했는지 궁금합니다. –

+0

네, 그 행동은 다소 이상합니다. 당신도 한계에 도달했다는 어떠한 징후도 얻지 못합니다. –

+0

CloudCode에서 사용할 수있는 창 개체가 없습니다. 이 코드는 어떻게 제대로 작동합니까? –

5

다음 대답은 (클라우드 코드에서 작동합니다). 비슷한 경우에도이 아키텍처를 성공적으로 사용했습니다.

Gene Z. Ragan이 자신의 의견에서 언급했듯이 'window'객체가 없기 때문에 현재 허용되는 답변은 클라우드 코드에서 작동하지 않습니다.

일반적인 Javascript 함수로 재귀가 오프로드 된 이유는 Parse에 Cloud Code 함수에 대한 재귀 제한이 매우 낮기 때문입니다. (필자는 Cloud Code 함수에 대한 4 회 이상의 재귀 호출이 오류가 발생 함을 확인했습니다). Javascript 함수에서 재귀를 구현하면 Parse의 재귀 제한을 무시하고 허용 된 시간 (약 15 초) 내에 코드가 실행되는 한 재귀 호출을 계속 수행 할 수 있습니다.

Parse.Cloud.define('getUserGlobalRank', function(request, response) { 
    getUserGlobalRank({'username':request.params.username, 'score':request.params.score}, { 
     success: function(count) { 
      response.success(count); 
     }, 
     error: function(error) { 
      response.error(error); 
     } 
    }); 
}); 

function getUserGlobalRank(request, response) { 

    var usernameString = request['username']; 
    var scoreAmount = request['score']; 
    var count = (request['count'])? request['count'] : 0; 

    var globalRankQuery = new Parse.Query("scoreDB"); 
    globalRankQuery.greaterThanOrEqualTo("score", scoreAmount); 
    globalRankQuery.descending("score"); 
    globalRankQuery.limit(1000); 
    globalRankQuery.skip(count); 
    globalRankQuery.find({ 
     success: function(results) { 
      if (results.length > 0) { 
       count = count + results.length; 
       getUserGlobalRank({'count':count, 'username':usernameString, 'score':scoreAmount}, response); 
      } 
      else { // found count of users with higher ranks 
       response.success(count); 
      } 
     }, 
     error: function(error) { // query error 
      response.error(error); 
     } 
    }); 
} 
4

목표는 모든 사용자가 Parse를 반복하는 것이 었습니다. 여기에 캠 Tullos의 대답을 기반으로 keither04의 답변에 따라 내 대답 =]

Parse.Cloud.job("checkUsers", function (request, response) 
{ 
    // {} - empty params for first iteration 
    getAllUsers({}, { 
     success: function (users) { 
      // Do stuff with users 
      response.success("Loaded " + users.length + " users"); 
     }, 
     error: function (error) { 
      response.error(error); 
     } 
    }); 
}); 

function getAllUsers (request, response) 
{ 
    var users = (request["users"]) ? request["users"] : []; 
    var skip = users.length; 
    var userQuery = new Parse.Query(Parse.User); 
    userQuery.limit(1000); 
    userQuery.skip(skip); 
    userQuery.find({ 
     success: function (results) { 
      if (results.length > 0) { 
       var allUsers = users.concat(results); 
       var params = {"users": allUsers}; 
       getAllUsers(params, response); 
      } else { 
       response.success(users); 
      } 
     }, 
     error: function (error) { 
      response.error(error); 
     } 
    }); 
} 

P.S이야 :이 약속을 사용 할 수 있는지 궁금 해요.

0

권장 사항을 구현하는 것으로 간주됩니다. 또한 skip은 불행히도 10,000 개까지만 지원되지만 꽤 잘못되었습니다. 전체 공개,이 코드를 테스트하지 않았습니다.

Parse.Cloud.job("checkUsers", function(request, response) { 
     // {} - empty params for first iteration 
     getAllUsers({}).then(function(users) { 
      // Do stuff with users 
      response.success("Loaded " + users.length + " users"); 
     }, 
     function(error) { 
      response.error(error); 
     }); 

    }); 

    function getAllUsers(request) { 
     // 
     var users = (request["users"]) ? request["users"] : []; 
     var skip = users.length; 
     var userQuery = new Parse.Query(Parse.User); 
     userQuery.limit(1000); 
     userQuery.skip(skip); 

     Parse.Promise.as().then(function() { 
     // 
     return userQuery.find().then(null, function(error) { 
      // 
      return Parse.Promise.error(error); 

     });  

     }).then(function(userObjects) { 
     // 
     if (userObjects.length > 0) { 
      var allUsers = users.concat(userObjects); 
      var params = {"users": allUsers}; 
      getAllUsers(params); 
     } else { 
      // 
      return Parse.Promise.resolve(allUsers); 
     }  

     }, 
     function(error) { 
     // 
     return Parse.Promise.reject(error); 
     }); 

    }