2012-12-15 6 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);     
     }, 

.........

हालांकि यह एक सटीक प्रतिक्रिया नहीं देंगे। मैं एक साथ जोड़ना चाहता हूं। फाइलों का एक सेट जो मैं बाद में एक काउंटर कर सकता हूं। क्या किसी को कोई विचार है कि मैं इसे कैसे प्राप्त कर सकता हूं? यदि आप एक कोड उदाहरण प्रदान कर सकते हैं जो बहुत अच्छा होगा!

बहुत धन्यवाद, जेम्स

+0

भी आप जिस सेवा का उपयोग कर रहे हैं उसका संदर्भ प्रदान करते हैं, तो हो सकता है कि कोई आपकी मदद कर सके। –

+0

इसे पारसे कहा जाता है। 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

यह काफी सरल होना चाहिए - आप दो या अधिक परिणाम सरणी को गठबंधन करने के लिए अंडरस्कोर जेएस के .union() का उपयोग कर सकते हैं। [http://underscorejs.org/#union] – Meirion

+0

क्या आप सुनिश्चित हैं कि 1000 की सीमा गिनती के लिए लागू नहीं होती है? दस्तावेज़ कहते हैं कि यह करता है, लेकिन इसके आसपास कुछ रास्ता होना चाहिए। बस सोच रहा है कि क्या आपने 1000 से अधिक वस्तुओं पर व्यक्तिगत रूप से उपयोग की जाती है। –

3

खबरदार। 1000 से अधिक वस्तुओं वाले वर्गों के लिए, गिनती संचालन टाइमआउट द्वारा सीमित हैं। वे नियमित रूप से टाइमआउट त्रुटियों या परिणाम लौट सकते हैं जो केवल लगभग सही हैं। इस प्रकार, इस तरह के गिनती ऑपरेशन से बचने के लिए अपने आवेदन को आर्किटेक्ट करना बेहतर है।)

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

क्लाउडकोड में कोई विंडो ऑब्जेक्ट उपलब्ध नहीं है। यह कोड सही ढंग से कैसे काम कर रहा है? –

5

निम्नलिखित जवाब बादल संहिता में काम के रूप में यह getUserGlobalRank को लगातार कॉल में एक समारोह पैरामीटर का उपयोग करके गिनती का ट्रैक रखता होगा (: मैं आम तौर पर इतनी तरह छोड़ पैरामीटर का उपयोग करें। मैंने इसी तरह के मामलों में सफलतापूर्वक इस वास्तुकला का उपयोग किया है।

जीन जेड रागन ने अपनी टिप्पणी में उल्लेख किया है, वर्तमान में स्वीकृत उत्तर क्लाउड कोड में काम नहीं करेगा क्योंकि वहां कोई 'विंडो' ऑब्जेक्ट नहीं है।

कारण नियमित रूप से जावास्क्रिप्ट फ़ंक्शन में रिकर्सन को ऑफ़लोड किया गया है क्योंकि क्लास कोड फ़ंक्शन के लिए पार्स की बहुत कम रिकर्सन सीमा है (मैंने सत्यापित किया है कि> क्लाउड कोड फ़ंक्शन पर 4 रिकर्सिव कॉल के परिणामस्वरूप त्रुटि होगी)। जावास्क्रिप्ट फ़ंक्शन में रिकर्सन को कार्यान्वित करके, आप पार्स की रिकर्सिव सीमा को बाईपास कर सकते हैं, और जब तक अनुमत समय (कोड लगभग 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

मेरा लक्ष्य पार्स पर सभी उपयोगकर्ताओं के माध्यम से फिर से शुरू करना था। यहाँ मेरा उत्तर keither04 के उत्तर के आधार पर कि कैम Tullos के जवाब पर आधारित है =]

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

पी.एस है .: मैं उत्सुक हूँ अगर यह वादों का उपयोग कर ऐसा करने के लिए संभव है।

0

मान लें कि इसे लागू करने वाले वादे के रूप में कार्य करना चाहिए। साथ ही, निश्चित रूप से सुनिश्चित है कि दुर्भाग्यवश 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); 
     }); 

    } 
संबंधित मुद्दे