如何删除满足某些条件的 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 在这里。祝你好运。
有什么方法可以有效地删除 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 在这里。祝你好运。