如何将解析云代码的query.count结果保存在变量中

How to save query.count result of parse cloud code in a variable?

本文关键字:结果 count 保存 存在 变量 query 代码      更新时间:2023-09-26

我是解析云代码的新手。我已经编写了一个函数,在该函数中,我试图根据适配器名称(用户输入)来获取特定过程的计数。我下面的代码是:

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()操作。用法在上述代码之一中。