解析:从云代码更新对象

时间:2015-11-27 19:51:09

标签: javascript parse-platform cloud-code

我创建了一个后台作业,每分钟运行一次。它的目的是删除数据库中的旧数据或过时数据。在这种情况下,用户提交一个附加时间戳的时间,这两个值存储在数组timestimestamp中。所以我编写了我的云代码,通过他们的时间戳检查时间是否超过一小时。如果是这样,请从数据库中删除它们。然而,那是我遇到麻烦的部分。这是我的云代码,因此您可以看到正在发生的事情:

Parse.Cloud.job("expireTimes", function(request, response){
Parse.Cloud.useMasterKey();
var currentTime = new Date().getTime() / 1000;
var query = new Parse.Query("Wait");
query.find().then(function(results) {
    var times = (results.length>0)? results[0].get("times") : "n/a";
    var timestamps = (results.length>0)? results[0].get("timestamp") : "n/a";
    console.log("Got " + results.length + " Times: " + times);
    console.log("Got " + results.length + " Timestamps: " + timestamps);
    for (var i = 0; i < timestamps.length; i++) {
        if (currentTime >= timestamps[i] + 3600) {
            // Delete old wait times
            timestamps.splice(i, 1);
            times.splice(i, 1);
            i--;
        } else {
            break;
        }
    };

    response.success("success");
}, function(error) {
    response.error(error);
});
})

如何更新数据库并删除数组中的值。因为当用户提交时间时,它只会添加到times数组。好吧,如果我每分钟都有后台工作,一些条目不会超过一个小时。我想保留那些,但摆脱其他的。

有什么想法吗?任何帮助深表感谢。 谢谢

2 个答案:

答案 0 :(得分:0)

答案的基本部分是可以使用set()设置对象属性,并使用save()保存对象。这是一个简单的例子......

    // say object is some object that's been retrieved from the database
    var times = object.get("times");
    var timestamps = object.get("timestamp");  // would be better to make the array name plural in the database

    // do whatever you want to the arrays here, then ...

    object.set("times", times);
    object.set("timestamp", timestamps);
    return results[0].save();
}).then(function(result) {
        response.success("success");
}, function(error) {
        response.error(error);
});

但我知道你真的想为许多Wait对象做这件事,所以我们需要一个更强大的设计。让我们开始养成构建逻辑块工作的函数的习惯。这是一个修复给定Wait对象的数组...

// delete parts of the waitObject time arrays prior to currentTime
function removeOldWaitTimes(waitObject, currentTime) {
    var times = waitObject.get("times");
    var timestamps = waitObject.get("timestamp");
    for (var i = 0; i < timestamps.length; i++) {
        if (currentTime >= timestamps[i] + 3600) {
            // Delete old wait times
            timestamps.splice(i, 1);
            times.splice(i, 1);
            i--;
        } else {
            break;
        }
    };
    waitObject.set("times", times);
    waitObject.set("timestamp", timestamps);
}

对于找到的每个Wait对象,我们需要在循环中调用它。当我们完成后,我们需要保存所有已更改的对象......

Parse.Cloud.job("expireTimes", function(request, response){
    Parse.Cloud.useMasterKey();
    var currentTime = new Date().getTime() / 1000;
    var query = new Parse.Query("Wait");
    query.find().then(function(results) {
        for (var i=0; i<results.length; i++) {
            removeOldWaitTimes(results[i], currentTime);
        }
        return Parse.Object.saveAll(results);
    }).then(function(result) {
        response.success("success");
    }, function(error) {
        response.error(error);
    });
});

请注意,随着Wait类中对象数量的增加,作业可能会变得太长,或者查询(可以设置为返回的1k对象的最大限制)可能会遗漏结果。如果成为风险,我们需要改进查询。 (例如,如果作业每小时运行一次,则没有理由检索超过一小时前更新的Wait对象。)

编辑说你想要更新一些,如上所述,并摧毁其他人。你需要处理两个承诺才能做到这一点......

Parse.Cloud.job("expireTimes", function(request, response){
    Parse.Cloud.useMasterKey();
    var destroyThese = [];
    var currentTime = new Date().getTime() / 1000;
    var query = new Parse.Query("Wait");
    query.find().then(function(results) {
        var updateThese = [];
        for (var i=0; i<results.length; i++) {
            var result = results[i];
            if (result.get("times").length > 0) {
                removeOldWaitTimes(result, currentTime);
                updateThese.push(result);
            } else {
                destroyThese.push(result);
            }
        }
        return Parse.Object.saveAll(updateThese);
    }).then(function(result) {
        return Parse.Object.destroyAll(destroyThese);
    }).then(function(result) {
        response.success("success");
    }, function(error) {
        response.error(error);
    });
});

我们将destroyThese数组放在封闭范围内,以便它可用于承诺链中的下一步。

答案 1 :(得分:0)

目前,我没有找到最佳解决方案,但它现在对我有用。

var Progress = Parse.Object.extend(PROGRESS);
var progressQuery = new Parse.Query(Progress);
progressQuery.equalTo("userId", userId)
progressQuery.find({
    success: function (progress){
        for (i = 0; i < progress.length; i++){
            progress[i].set("lastUse", false)
            progress[i].save()
        }

    },
    error: function(object, error) {
        console.log(error)
    }
})