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

时间:2015-03-09 02:36:36

标签: parse-platform cloud-code

有没有办法有效地删除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
});

2 个答案:

答案 0 :(得分:5)

几乎就是: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的表,需要花一点时间来处理promises。想法是在表格中进行游标,分组以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();
    });
}

答案 1 :(得分:1)

1802请求是速率限制(30 /秒)。下一个想法是将工作批量处理为较小的事务计数承诺并按顺序运行它们,保持较低的速率,但随着时间的推移将其延长。这是我上面提出的几种形式的要点(在我明白你有~500k行之前)。

不幸的是,解析也强制执行10秒的超时限制。我认为每秒删除大约1k行是可以实现的,但我担心你的500k表不会屈服于免费层上的任何方法。我认为你只有这些选择:

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

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

(c)parse.com后台工作,定期唤醒并蚕食它。你只能在免费套餐中获得其中一个,我想大多数时候它会经常醒来并浪费电力。

(d)支付。

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