2013-11-25 1 views
6

Parse Frameworkの非同期クラウドバックグラウンドジョブを作成しました。これは、各ユーザーの表示ユーザー名を「@」記号の前の電子メールに基づいて生成します。残念ながら、私は、ジョブを実行すると、 "カウント操作が多すぎます"というエラーが表示されます。パラレルではなくクエリとセーブを直列に実行する方法はありますか?私はドキュメントでそれが可能であることを見ましたが、ネストされたクエリで動作させる方法については混乱しています。Parse Frameworkで同期クエリを実行するクラウドコード

Parse.Cloud.job("generateUsernameForEveryUser", function(request, status) { 

    // Set up to modify user data 
    Parse.Cloud.useMasterKey(); 
    var counter = 0; 
    // Query for all users 
    var query = new Parse.Query(Parse.User); 
    query.each(function(user) { 

    createUsernameForUser(user, 0, { 
     success: function(username) { 
     if(username == null) { 
      status.error(); 
     } else { 
      user.set("displayUsername", username); 
      user.set("displayUsernameUppercase", username.toUpperCase()); 
      user.save(); 
     } 
     }, 
     error: function(error) { 
     status.error("Error: " + error.message); 
     }   

    }); 

    }).then(function() { 
    // Set the job's success status 
    status.success("Username generation completed successfully."); 
    }, function(error) { 
    // Set the job's error status 
    status.error("Uh oh, something went wrong."); 
    }); 

}); 

function createUsernameForUser(user, count, callback) { 

    var generatedUsername = user.getEmail().substring(0, user.getEmail().indexOf("@")); 

    if(count > 0) { 
    //Quotes added to ensure no math is done between generatedUsername and count 
    generatedUsername = "" + generatedUsername + "" + count; 
    } 

    var userQuery = new Parse.Query(Parse.User); 
    userQuery.equalTo("displayUsernameUppercase", generatedUsername.toUpperCase()); 
    userQuery.count({ 

    success: function(userCount) { 

     if(userCount > 0) { 
     createUsernameForUser(user, count + 1, { 
      success : function(responseUsername) { 
      callback.success(responseUsername); 
      }, 
      error: function(error) { 
      callback.error(error.message); 
      } 
     }); 
     } 

     else { 
     callback.success(generatedUsername); 
     } 

    }, 
    error: function(error) { 
     console.log("Error trying to count users: " + error.message); 
     callback.error("Error trying to count users: " + error.message); 
    } 

    });//End of userQuery call 

} 

答えて

0

これは非常に遅い回答ですが、これを通過するユーザーに役立ちます。

too many count operations query.eachは、そのクラスのデータが100個以下の場合にのみ機能します。

次のように私たちは、同じ要件をacheiveすることができます

  1. は、すべてのユーザーを取得します。
  2. ユーザー名を作成し、配列に格納します。詳細については、parse.comのバッチ操作を参照してください。 var users = new Array(); .... push all the created user objects to users .... Parse.Object.saveAll(users); //save the list -

これが解決します。

関連する問題