Parse Cloud -- 如何根据另一个 table 中的匹配列更新列?

Parse Cloud -- How to update column based on matching column in another table?

在 Parse 中,我只能分割 Installation table 以向特定数量的用户发送推送通知。因此,我在 Installation table 中创建了一个名为 sendPush 的列,我将在发送推送通知时使用该列进行分段。

只要电子邮件在另一个 table - SendPushTo.

中匹配,我想将新列设置为 true

这是两个 table(具有属性):

安装(邮件、发送推送)

SendPushTo(电子邮件)

如果电子邮件在 SendPushTo table 中,我想简单地将 sendPush(布尔类型)设置为 true。换句话说,将 sendPush 设置为 true 用于 tables.

中的电子邮件地址

我尝试编写 Parse Cloud Code 来解决这个问题,但由于某些原因它只更新了 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 行被更新。

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

谢谢。

why does it only update nine rows?

您可能 timing out。来自 Parse Cloud 代码指南:

Cloud functions will be killed after 15 seconds of wall clock time... If you need additional time to perform operations in Cloud Code, consider using a 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到运行并行保存代码并等待所有任务完成,然后你可以调用success/failure。例如,您的代码可以是:

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);
});