如何将解析云代码的query.count结果保存在变量中
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包含两个字段,分别是adapterName(字符串)和procedure(字符串)。
mst_log报告
adapter, procedure
A, x
A, x
A, y
B, x
B, y
用户输入
你想得到〔{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()速度较慢,对数据库加载过高。
您应该维护两个类,Adapter和Procedure。
Adapter: name(string), procedureCnt(jsonObject)
Procedure: adapter(pointer of adapter), name(string)
存储过程
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:
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()操作。用法在上述代码之一中。
- 奇怪的Javascript结果
- Javascript(jQuery)给了我奇怪的结果
- JSONP请求返回结果,但也触发error_callback
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- Javascript,输出结果后页面不断刷新
- 这是使用html快照和谷歌获取的预期结果吗?SEO/SPA
- 将地理编码结果转换为php变量以发布到mysql数据库
- AngularJS/HTML/Bootstrap元素用于动态搜索结果
- JQuery:向多个匹配结果添加换行符的最简单方法
- 当查询不在displayField中时,引导Ajax Typeahead不显示结果
- webpack代码拆分了handlerbs文件——结果是文件很大
- JavaScript循环无法正确计算/显示结果
- 相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- 试图将onChange函数作为道具传递给GrandChlidren,结果是TypeError:这是未定义的
- jQuery使用api获取typeform结果
- 根据条件检查数据库结果
- 什么'这是从第三个函数上的async 1st函数获得结果的更好方法
- Angular,表达式{{}}的结果没有插入到ng-click中
- 如何将解析云代码的query.count结果保存在变量中