如何删除满足某些条件的 Parse 行?

How to delete rows in Parse that satisfy some conditions?

有什么方法可以有效地删除 Parse 中执行类似 SQL 语句的行?

DELETE FROM table WHERE delete_me = 1

我已经试过了,但是速度很慢:

var query = new Parse.Query('table');
query.equalTo('delete_me', 1);

query.each(function(obj) {

    return obj.destroy();

}).then(function() {
    // Done
}, function(error) {
    // Error
});

差不多了:find() 将得到满足删除条件的对象,然后 destroyAll() 将它们全部销毁。

var query = new Parse.Query('table');
query.equalTo('delete_me', 1);
query.find().then(function(results) {
    return Parse.Object.destroyAll(results);
}).then(function() {
    // Done
}, function(error) {
    // Error
});

Edit - 要删除超过 1k 的 table,需要一些额外的承诺工作。这个想法是通过 table 游标,以 1k(或一些更小的增量)为一批对发现进行分组,使用 Promise.when() 同时执行这些发现,然后以相同的方式同时销毁结果......

var query = new Parse.Query('table');
query.equalTo('delete_me', 1);
query.count().then(function(count) {
    var finds = [];
    for (var i=0; i<count; i+=1000) {
        finds.push(findSkip(i));
    }
    return Parse.Promise.when(finds);
}).then(function() {
    var destroys = [];
    _.each(arguments, function(results) {
        destroys.push(Parse.Object.destroyAll(results));
    });
    return Parse.Promise.when(destroys);
}).then(function() {
    // Done
}, function(error) {
    // Error
});

// return a promise to find 1k rows starting after the ith row
function findSkip(i) {
    var query = new Parse.Query('table');
    query.limit(1000);
    query.equalTo('delete_me', 1);
    query.skip(i);
    return query.find();
}

编辑 2 - 这可能会更快,但您需要凭经验发现:

// return a promise to delete 1k rows from table, promise is fulfilled with the count deleted
function deleteABunch() {
    var query = new Parse.Query('table');
    query.limit(1000);
    query.equalTo('delete_me', 1);
    query.find().then(function(results) {
        return Parse.Object.destroyAll(results).then(function() {
            return results.length;
        });
    });
}

function deleteAll() {
    return deleteABunch().then(function(count) {
        return (count)? deleteAll() : Parse.Promise.as();
    });
}

1802 请求是速率限制(30/秒)。下一个想法是将工作分批处理成更小的事务计数承诺,并 运行 连续进行,保持低速率但随着时间的推移延长它们。这是我上面几种形式的建议的要点(在我明白你有 ~500k 行之前)。

不幸的是,解析也强制执行 10 秒的超时限制。我认为每秒删除约 1k 行是可以实现的,但我担心您的 500k table 不会屈服于免费层上的任何方法。我认为你只有这些选择:

(a) 限制客户端 - 使用某种形式的 setTimeout() 来执行足够小、足够短的批处理。 (这就是我的应用程序处理它的方式,因为繁重的工作仅由管理员完成,我可以指示他们不要重新加载页面。)。

(b) 部署您自己的节点服务器,它基本上实现了想法 (a),以足够小的步骤调用 parse.com 以使其满意,但不会给客户端带来计算负担。

(c) 一个 parse.com 后台作业,它会定期唤醒并蚕食它。您只能在免费套餐中获得其中之一,我想大多数时候它只会频繁唤醒并浪费电力。

(d) 支付。

我今天晚些时候可以做一些实际的 code/test。如果我学到任何新东西,我会 post 在这里。祝你好运。