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);
});
在 Parse 中,我只能分割 Installation
table 以向特定数量的用户发送推送通知。因此,我在 Installation
table 中创建了一个名为 sendPush
的列,我将在发送推送通知时使用该列进行分段。
只要电子邮件在另一个 table - SendPushTo
.
这是两个 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);
});