我已经将包含自引用父/子关系的表导入到Parse.com中的类中。 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");
}
});
})
这将返回已更正的记录集,但不会将其保存在数据库中。注意:测试只是一个测试字段,可以在切换到更新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个被更新。工作成功返回。
斯蒂芬
答案 0 :(得分:1)
您遇到的问题几乎肯定与您处理异步保存的方式有关。
您只获得少量保存的原因是代码在紧密循环中异步启动它们然后返回。你在循环结束时完成了一些保存,一旦你运行了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);
});