有没有办法有效地删除 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
});
编辑 - 要删除超过 1k 的表,需要额外的一些 promise 工作。这个想法是通过表游标,以 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();
});
}
关于parse-platform - 如何删除Parse中满足某些条件的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28934448/