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.
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