2016-05-13 3 views
4

Ich bin neu, Cloud-Code zu analysieren. Ich habe eine Funktion geschrieben, in der ich versuche, anhand des Adapternamens (User-Input) die Anzahl der einzelnen Prozeduren zu ermitteln. Mein Code ist:Wie speichere ich das Ergebnis von query.count von parse cloud code in einer Variablen?

Parse.Cloud.define("getProcedureList",function (req, res) 
{ 
    var resultCount; 
    var query = new Parse.Query("mst_logReports"); 
    query.limit(10); 

    query.equalTo("adapterName",req.params.adapterName); 
    query.find({ 
     success: function (result) { 
      var resultArr = []; 
      var resultlen = result.length; 

      var tempArr = {}; 
      if (resultlen > 0) { 
       for (var i = 0; i < resultlen; i++) { 
        tempArr = { 

         "procedure":result[i].get("procedure") : 

         // (here I want the count of this procedure). 
         // How to use query.count inside this for loop 
         // so that I can get the counts? 

        } 
        resultArr.push(tempArr); 
       } 
      } 
      res.success(resultArr); 
     }, 
     error: function (error) { 
      res.success(error); 
     } 
    }) 
}); 

Hinweis: Der Code funktioniert einwandfrei. Aber ich bin nicht in der Lage, die Anzahl dieser bestimmten Prozedur in meinem Code oben zu erhalten.

Jede Hilfe wäre willkommen. Dank

+0

Zu viele Anfragen auf Cloud-Code ist nicht geeignet, es hat nur 15 Sekunden. Der bessere Weg besteht darin, eine Zählung für Ihr mst_logReports-Objekt beizubehalten. – ChunTingLin

Antwort

0

Ich kann nicht verstehen, was Sie genau wollen.

Ich gehe davon aus, dass Sie von jedem mst_logReports bekommen zählt wollen widersprechen.

Zu viele Anfragen auf Cloud-Code ist nicht geeignet, es hat nur 15 Sekunden. Der bessere Weg besteht darin, eine Zählung für Ihr mst_logReports-Objekt beizubehalten. Sie können Increment im afterSave verwenden (stellen Sie sicher, dass es gespeichert wurde).

=================== bearbeitet =================

Die mst_logReports enthalten 2-Feld , die adapterName (String) und procedure (String) sind.

mst_logReports

adapter, procedure 
A, x 
A, x 
A, y 
B, x 
B, y 

Ihren Benutzereingaben A

Sie erhalten möchten [{x: 2}, {y, 1}]

var procedureCnts = {}; 
for(var i=0; i<counts.length; i++){ 
    var procedure = result[i].get("procedure"); 
    if(procedureCnts[procedure]){ 
     procedureCnts[procedure]++; 
    }else{ 
     procedureCnts[procedure] = 0; 
    } 
} 
for(var key in procedureCnts){ 
    tempArr = { 
     "procedure" : key, 
     "count": procedureCnts 
    } 
    resultArr.push(tempArr); 
} 

res.success(resultArr); 

Leider Diese Funktion kann nicht skaliert werden, da query.limit nicht> 1000 sein kann.

Wenn alle Verfahren Typ fixiert. Sie können unten versuchen (wie meine erste Antwort Art und Weise)

Parse.Cloud.define("getProcedureList",function (req, res) 
{ 
    var possibleProcedures = ['x', 'y', 'z']; 
    var promises = []; 
    var results = []; 
    for(var i=0; i<possibleProcedures.length; i++){ 
     var query = new Parse.Query("mst_logReports"); 
     query.equalTo("adapterName", req.params.adapterName); 
     query.equalTo("procedure", possibleProcedures[i]); 
     promises.push(query.count()); 
    } 

    //Parse.Promise.when() is closed to es6 Promise.all() 
    Parse.Promise.when(promises) 
    //arguments.length will equalTo promises.length, or declare arg1, arg2 ... to fit resultLen 
    .then(function(){ 
     //promises.length == arguments.length 

     for(var i=0; i< arguments.length; i++){ 
      results.push({ 
       "procedure": possibleProcedures[i], 
       "count": arguments[i] 
      }); 
     } 
     res.success(results); 
    }, res.error); 

}); 

Wenn die mögliche Prozedur nicht festgelegt ist, kann ich nicht eine richtige Lösung zu passen Ihr Problem finden.

================ andere Lösung ==============

Der nächste Weg ist flexibler und vermeiden, dass zu viele API-Anfrage. Und query.count() ist langsam und lädt für db zu hoch.

Sie sollten 2 Klasse, Adapter und Verfahren pflegen.

Adapter: name(string), procedureCnt(jsonObject) 
Procedure: adapter(pointer of adapter), name(string) 

saveProcedure

function(adapterName){ 
    var query = new Parse.Query("Adapter"); 
    query.equalTo("name", adapterName); 
    query.first().then(
     function(adapter){ 
      if(adapter){ 
       var Procedure = Parse.Object.extend("Procedure"); 
       var procedure = new Procedure(); 
       procedure.set('adapter', adapter); 
       procedure.save().then(response.success, response.error); 
      }else{ 
       response.error("the adapter is not exist"); 
      } 
     }, response.error 
    ); 
} 

aftersave Ordnung:

Parse.Cloud.afterSave("Procedure", function(req) { 
    var procedure = req.object; 
    var adapter = procedure.get('adapter'); 
    var key = 'procedureCnt.' + procedure.get('name'); 
    adapter.increment(key, 1); 
    adapter.save(); 
}); 

AfterDelete Ordnung:

Parse.Cloud.afterDelete("Procedure", function(req) { 
    var procedure = req.object; 
    var adapter = procedure.get('adapter'); 
    var key = 'procedureCnt.' + procedure.get('name'); 
    adapter.increment(key, -1); 
    adapter.save(); 
}); 

Abfrage cnt einen Adapter

function(name){ 
    var query = new Parse.Query("Adapter"); 
    query.equalTo('name', name); 
    query.first().then(
     function(adapter){ 
      if(adapter){ 
       response.success(adapter.get('procedureCnt')); 
      }else{ 
       response.error('adapter not found'); 
      } 
     }, reponse.error 
    ); 
} 

Das einzige Problem ist, dass AfterSave nicht immer erfolgreich ist. Nicht vorschlagen, dass Sie noch viel query.count() von Parse.Promise.when() ausführen können. Die Verwendung erfolgt in einem der obigen Codes.

+0

Danke ChunTingLin für Ihre Hilfe. Aber ich möchte wissen, wie die Methode query.count innerhalb dieser Schleife verwendet wird, so dass ich nur die Anzahl der Prozeduren abrufen kann, nicht die ganzen Tabellenobjekte und auch die Verwendung von query.count ohne Verwendung einer Variablen oder einer Schleife dafür. Warte auf deine aktualisierte Antwort. Danke –

+0

Ich kann nicht verstehen, was du meinst. Können Sie Ihren Code so weit aktualisieren, wie Sie möchten? – ChunTingLin

+0

Was ist "Anzahl der Prozeduren", was ist der Typ von mst_logReports.procedure? Warum willst du query.count? Frage zu welcher Klasse, und die Einschränkung ist was? – ChunTingLin

Verwandte Themen