5

次の関数を使用して、スコアボードでユーザーのランクを決定しています。

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

.........

ただし、その基準を満たすエントリが 1000 件を超えると、正確な応答が得られません。後で .count を実行できる一連の .find メソッドを連鎖させたいと考えています。どうすればこれを達成できるか誰にもわかりませんか?素晴らしいコード例を提供できれば!

どうもありがとう、ジェームズ

4

5 に答える 5

5

次の回答は Cloud Code で機能します。これは、getUserGlobalRank() への連続した呼び出しで関数パラメーターを使用してカウントを追跡するためです。私はこのアーキテクチャを同様のケースでうまく使用しました。

Gene Z. Ragan がコメントで述べたように、「ウィンドウ」オブジェクトがないため、現在受け入れられている回答は Cloud Code では機能しません。

再帰が通常の 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);
        }
    });
}
于 2015-05-26T00:41:19.177 に答える
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

h番目

于 2013-02-15T17:47:15.800 に答える