使用Chaining克服Cloud Code Parse Limit 1000?

Jam*_*LCQ 5 javascript parse-platform

我有以下功能,我用它来确定记分板中的用户排名.

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);                
        },
Run Code Online (Sandbox Code Playgroud)

.........

但是,如果有超过1000个符合该条件的条目,则不会给出准确的响应.我想将一组.find方法链接在一起,然后我可以执行.count.有谁知道我怎么能做到这一点?如果你能提供一个很棒的代码示例!

非常感谢,詹姆斯

kei*_*r04 5

以下答案适用于Cloud Code,因为它通过在连续调用getUserGlobalRank()时使用函数参数来跟踪计数.我成功地在类似的情况下使用了这种架构.

正如Gene Z. Ragan在评论中提到的那样,当前接受的答案在Cloud Code中不起作用,因为没有"窗口"对象.

将递归卸载到常规Javascript函数的原因是因为Parse对云代码函数的递归限制非常低(我已经验证>对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);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


Mei*_*ion 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
Run Code Online (Sandbox Code Playgroud)

奖励积分 -.limit()采用数字作为参数,而不是代码中的字符串。 https://www.parse.com/docs/js/symbols/Parse.Query.html#limit