自引用 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);
});