Parse platform 如何删除解析中满足某些条件的行?

Parse platform 如何删除解析中满足某些条件的行?,parse-platform,parse-cloud-code,Parse Platform,Parse Cloud Code,是否有任何方法可以有效地删除解析中执行类似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

是否有任何方法可以有效地删除解析中执行类似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
});
编辑-要删除超过1k的表,需要对承诺做一些额外的工作。其思想是通过游标遍历表,以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();
}

1802请求是速率限制(30/秒)。下一个想法是将工作批量到较小的事务计数承诺中,并连续运行它们,保持较低的速率,但随着时间的推移,它们会逐渐扩展。这是我以上建议的要点,有几种形式(在我了解到您有大约500k行之前)

不幸的是,parse也强制执行10秒的超时限制。我认为每秒删除约1k行是可以实现的,但我担心您的500k表不会屈服于空闲层上的任何方法。我认为你只有以下几种选择:

(a) 客户端上的节流-使用某种形式的setTimeout(),以执行足够小、足够短的批处理。(我的应用程序就是这样处理的,因为繁重的工作只有管理员才能完成,我可以指示他们不要重新加载页面。)

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

(c) 一种parse.com后台作业,它周期性地唤醒并逐渐消失。你只能在免费层得到其中一个,我想大多数时候,它会频繁醒来,浪费电能

(d) 付钱


今天晚些时候我可以做一些实际的代码/测试。如果我学到了什么新东西,我会在这里发布。祝你好运。

我也试过这个,但1)find()最多只能检索1000个结果2)速度仍然很慢,每分钟删除17~19行1)是的,一次删除1k(我将对此进行编辑),2)你的计时结果比我看到的要差得多。你在跑步前有没有什么动作?啊,我的意思是每秒17~19次。我需要删除500k行,所以大约需要7个小时…仍然需要两个小时。另外,你的问题没有暗示你真正的问题,这实际上是关于规模的。我在后台作业上运行它,文档说“应用程序可能在其请求限制内每20个请求/秒有一个作业同时运行。”因此我认为17~19是合理的。我不认为这与规模有关,因为500k实际上并不是一个很大的数字。我使用了一个后台作业(并用Parse.Promise()替换setTimeout(),因为那里没有setTimeout()),现在它工作得很好。谢谢,Parse是这么说的
// 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();
    });
}