自引用 Parse.com class
Self referencing Parse.com class
我已经将包含自引用 parent/child 关系的 table 导入到 Parse.com 中的 class 中。 Parse 创建一个新 ID,我现在想用它替换 UID。我似乎无法更新所有相应的父 ID 字段。
我几乎已经设法通过一些云代码让它运行起来了:
Parse.Cloud.define("updatePID", function(request, response) {
var _results={};
var query = new Parse.Query("ww_notes");
query
.limit(1000)
.find({
success: function(results){
for (var i=0; i<results.length; i++){
_results[results[i].get("uid")] = results[i].id;
};
for (var i=0; i<results.length; i++){
if (_results[results[i].get("pid")]){
results[i].set("test", _results[results[i].get("pid")]);
results[i].save();
};
};
response.success(results);
},
error: function(){
response.error("failed PID update");
}
});
})
这 returns 更正后的记录集,但没有将其保存在数据库中。注意:test 只是一个测试字段,用于在切换到更新 PID 之前使此功能正常工作。我试图通过将静态写入移动到第一个循环来简化问题:
for (var i=0; i<results.length; i++){
_results[results[i].get("uid")] = results[i].id;
results[i].set("test", "things");
results[i].save();
};
这只更新了 245 条记录中的 4 条。发回的记录集已正确更新,但 Parse 数据存储没有。我创建了一个等效的作业,导致 245 条记录中的 27 条被更新。作业成功返回。
斯蒂芬
您遇到的问题几乎肯定与您处理异步保存的方式有关。
您只获得少量保存的原因是代码在紧密循环中异步启动它们,然后 returns。当循环结束时,您将完成一些保存,然后一旦您 运行 response.
就不再保存了。
修复方法是批量保存并使用这样的承诺...
// ...
query.limit(1000);
query.find().then(function(results) {
for (var i=0; i<results.length; i++){
_results[results[i].get("uid")] = results[i].id;
};
// we'll save everything in this array
var toSave = [];
for (var i=0; i<results.length; i++){
if (_results[results[i].get("pid")]){
results[i].set("test", _results[results[i].get("pid")]);
toSave.push(results[i]);
};
};
// return a promise that's complete when everything is saved
return Parse.Object.saveAll(toSave);
}).then(function(results) {
response.success(results);
}, function(error) {
response.error(error);
});
我已经将包含自引用 parent/child 关系的 table 导入到 Parse.com 中的 class 中。 Parse 创建一个新 ID,我现在想用它替换 UID。我似乎无法更新所有相应的父 ID 字段。
我几乎已经设法通过一些云代码让它运行起来了:
Parse.Cloud.define("updatePID", function(request, response) {
var _results={};
var query = new Parse.Query("ww_notes");
query
.limit(1000)
.find({
success: function(results){
for (var i=0; i<results.length; i++){
_results[results[i].get("uid")] = results[i].id;
};
for (var i=0; i<results.length; i++){
if (_results[results[i].get("pid")]){
results[i].set("test", _results[results[i].get("pid")]);
results[i].save();
};
};
response.success(results);
},
error: function(){
response.error("failed PID update");
}
});
})
这 returns 更正后的记录集,但没有将其保存在数据库中。注意:test 只是一个测试字段,用于在切换到更新 PID 之前使此功能正常工作。我试图通过将静态写入移动到第一个循环来简化问题:
for (var i=0; i<results.length; i++){
_results[results[i].get("uid")] = results[i].id;
results[i].set("test", "things");
results[i].save();
};
这只更新了 245 条记录中的 4 条。发回的记录集已正确更新,但 Parse 数据存储没有。我创建了一个等效的作业,导致 245 条记录中的 27 条被更新。作业成功返回。
斯蒂芬
您遇到的问题几乎肯定与您处理异步保存的方式有关。
您只获得少量保存的原因是代码在紧密循环中异步启动它们,然后 returns。当循环结束时,您将完成一些保存,然后一旦您 运行 response.
就不再保存了。
修复方法是批量保存并使用这样的承诺...
// ...
query.limit(1000);
query.find().then(function(results) {
for (var i=0; i<results.length; i++){
_results[results[i].get("uid")] = results[i].id;
};
// we'll save everything in this array
var toSave = [];
for (var i=0; i<results.length; i++){
if (_results[results[i].get("pid")]){
results[i].set("test", _results[results[i].get("pid")]);
toSave.push(results[i]);
};
};
// return a promise that's complete when everything is saved
return Parse.Object.saveAll(toSave);
}).then(function(results) {
response.success(results);
}, function(error) {
response.error(error);
});