[英]How to save query.count result of parse cloud code in a variable?
我是新手来解析云代码。 我写了一个函数,我试图在适配器名称(用户输入)的基础上获取特定过程的计数。 我的代码如下:
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);
}
})
});
注意:代码工作正常。 但我无法在上面的代码中获得该特定过程的计数。
任何帮助,将不胜感激。 谢谢
我无法抓住你想要的东西。
我假设您希望每个mst_logReports对象获取计数。
success: function (result) {
var resultArr = [];
var resultlen = result.length;
var tempArr = {};
if (resultlen > 0) {
var promises = [];
for (var i = 0; i < resultlen; i++) {
var report = result[i];
var query = new Parse.Query('???');
query.equalTo('xxx', report.get('qqq'));
promises.push(query.count());
}
Parse.Promise.when(promises)
//arguments.length will equalTo promises.length, or declare arg1, arg2 ... to fit resultLen
.then(function(){
//get all count success
var counts = arguments;
for(var i=0; i<counts.length; i++){
//why this object end with : ????
tempArr = {
"procedure":result[i].get("procedure") :
}
resultArr.push(tempArr);
}
res.success(resultArr);
}, res.error);
} else {
res.success(resultArr);
}
}
对云代码的请求太多不合适,只有15秒。 更好的方法是保持对mst_logReports对象的计数。 您可以在afterSave中使用增量(确保已保存)。
===================编辑=================
mst_logReports包含2个字段,它们是adapterName(String)和procedure(String)。
mst_logReports
adapter, procedure
A, x
A, x
A, y
B, x
B, y
你的用户输入A.
你想得到[{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);
遗憾的是,由于query.limit不能> 1000,此函数无法扩展。
如果所有过程类型都已修复 。 你可以在下面试试(作为我的第一个回答方式)
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);
});
如果可能的程序没有修复 ,我找不到适合您的问题的正确解决方案。
================其他解决方案==============
下一种方式更灵活,避免过多的api请求。 并且query.count()很慢并且对于db来说加载太高。
您应该维护2类,适配器和过程。
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 of Procedure:
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();
});
删除程序后:
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();
});
查询适配器的cnt
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
);
}
唯一的问题是AfterSave并不总是成功。 不建议你,你仍然可以通过Parse.Promise.when()做很多query.count()。 用法是上述代码之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.