Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to delete rows in Parse that satisfy some conditions?

Is there any way to effectively delete rows in Parse that do something like this SQL statement?

DELETE FROM table WHERE delete_me = 1

I've tried this, but it's very slow:

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

query.each(function(obj) {

    return obj.destroy();

}).then(function() {
    // Done
}, function(error) {
    // Error
});
like image 624
iForests Avatar asked Dec 25 '22 22:12

iForests


1 Answers

The 1802 request thing is the rate-limit (30/sec). The next idea is to batch the work into smaller transaction-count promises and run them serially, keeping the rate low but stretching them out over time. That's the gist of my suggestion above in a couple of forms (before I understood that you have ~500k rows).

Unfortunately, parse enforces a 10sec timeout limit, too. I think about ~1k rows deleted per sec is achievable, but I fear your 500k table will not yield to any method on the free tier. I think you have only these alternatives:

(a) throttle on the client - use some form of setTimeout(), to perform small enough, short enough batches. (This is how my app handles it, because the heavy work is done only by admins, and I can instruct them to not reload a page.).

(b) deploy your own node server which basically implements idea (a), calling parse.com in small enough steps to keep it happy but places no computational burden on the client.

(c) a parse.com background job that wakes periodically and nibbles away at it. You only get one of these on the free tier, and I imagine most of the time it will just wake frequently and waste electricity.

(d) pay.

I'll be able to do some actual code/test late today. If I learn anything new I'll post here. Best of luck.

like image 87
danh Avatar answered Feb 04 '23 05:02

danh