繁体   English   中英

如何在变量中保存解析云代码的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包含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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM