解析云 - 如何根据另一个表中的匹配列更新列?

时间:2015-04-17 17:47:50

标签: javascript database parse-platform cloud

在Parse中,我只能将Installation表分段,以便向特定数量的用户发送推送通知。所以,我在sendPush表中创建了一个名为Installation的列,我将在发送推送通知时将其用于分段。

每当电子邮件在另一个表格中匹配时,我想将新列设置为true - SendPushTo

这两个表(带属性):

安装(email,sendPush)

SendPushTo (电子邮件)

如果电子邮件在sendPush表中,我想简单地将SendPushTo(布尔类型)设置为true。换句话说,对于两个表中的电子邮件地址,将sendPush设置为true。

我曾尝试编写解析云代码来解决此问题,但由于某种原因,它只更新了9个值。

以下是代码:

Parse.Cloud.define("setPushVals", function(request, response) {
Parse.Cloud.useMasterKey();

    var sendPushTo = Parse.Object.extend("SendPushTo"); //table with emails
    var pushQuery = new Parse.Query(sendPushTo);
    pushQuery.limit(1000);
    var columnName = "sendPush";

    var recipientQuery = new Parse.Query(Parse.Installation);
    recipientQuery.limit(1000);
    recipientQuery.matchesKeyInQuery("email", "email", pushQuery);

    recipientQuery.find({
        success: function(recipients) {
            var i;
            for (i = 0; i < recipients.length; i++) {
               var recipient = recipients[i];
               recipient.set(columnName, true);
               recipient.save ();
            }
            response.success("Updated " + recipients.length + "-many recipients");
        },
        error:function (error)
        {
            response.error("Failed to save vote. Error=" + error.message);
        }
    });
});

如果我重新运行添加了这一行的代码(在调用find之前):

recipientQuery.notEqualTo(columnName, true);

...它会更新接下来的9行。因此,我目前使用的解决方案是多次调用函数(setPushVals)(每次将另外9行设置为true),直到所有行都更新为止。

另外,我应该注意recipients.length总是作为要更新的当前行数而出现,但是当我检查Parse时,只更新了9个。

有没有更简单的方法来做到这一点,为什么它只更新九行?

谢谢。

1 个答案:

答案 0 :(得分:0)

  

为什么它只更新九行?

你可能是timing out。从Parse Cloud Code Guide:

  

在15秒的挂钟时间后,云功能将被杀死...   如果您需要更多时间在Cloud Code中执行操作,请考虑使用background job


编辑:

我还应该指出这段代码:

for (i = 0; i < recipients.length; i++) {
    var recipient = recipients[i];
    recipient.set(columnName, true);
    recipient.save ();
}
response.success("Updated " + recipients.length + "-many recipients");

不等待保存完成。它遍历所有收件人并将它们保存在后台。当循环代码完成时,它会调用response.success(...),这会停止任何进一步的执行。

您应该使用promises并行运行保存代码并等待所有任务完成,然后您可以调用成功/失败。例如,您的代码可能是:

recipientQuery.find().then(function(recipients) {
    var promises = [];
    for (var i = 0; i < recipients.length; i++) {
        var recipient = recipients[i];
        recipient.set(columnName, true);
        promises.push(recipient.save ());
    });
    // Return a new promise that is resolved when all of the saves are  finished.
    return Parse.Promise.when(promises);
}).then(function() {
    response.success(...);
}, function(error) {
    response.error(error.message);
});