是否有任何方法有效地删除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
});发布于 2015-03-09 02:59:23
几乎是这样的: 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();
}编辑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();
});
}发布于 2015-03-10 14:42:52
1802年的请求是速率限制(30/秒)。下一个想法是将工作分批到较小的事务计数承诺中,并按顺序运行,保持较低的速率,但随着时间的推移而延长。这就是我上面建议的几种形式的要点(在我还没有理解到你有500 K行之前)。
不幸的是,解析也强制执行10秒的超时限制。我认为每秒删除1k行是可以实现的,但我担心您的500 k表不会屈服于空闲层上的任何方法。我认为你只有以下几种选择:
(a)客户端上的节流--使用某种形式的setTimeout()来执行足够小、足够短的批处理。(这就是我的应用程序处理它的方式,因为繁重的工作只能由管理员来完成,我可以指示他们不要重新加载页面。)
(b)部署您自己的节点服务器,它基本上实现了idea (a),以足够小的步骤调用parse.com,使其保持愉快,但不会给客户端带来计算负担。
(c)一个parse.com背景作业,它会周期性地醒来并一点一点地消失。你只得到一个免费的层,我想大多数时候,它只会经常醒来,浪费电力。
(d)支付。
今天晚些时候,我将能够做一些实际的代码/测试。如果我学到什么新的东西,我会在这里发帖子。祝你好运。
https://stackoverflow.com/questions/28934448
复制相似问题