首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除符合某些条件的Parse行?

如何删除符合某些条件的Parse行?
EN

Stack Overflow用户
提问于 2015-03-09 02:36:36
回答 2查看 4.9K关注 0票数 5

是否有任何方法有效地删除Parse中执行类似SQL语句的行?

代码语言:javascript
复制
DELETE FROM table WHERE delete_me = 1

我试过了,但很慢

代码语言:javascript
复制
var query = new Parse.Query('table');
query.equalTo('delete_me', 1);

query.each(function(obj) {

    return obj.destroy();

}).then(function() {
    // Done
}, function(error) {
    // Error
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-09 02:59:23

几乎是这样的: find()将获得符合删除条件的对象,然后destroyAll()将全部销毁。

代码语言:javascript
复制
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()并发执行这些查找,然后以同样的方式销毁结果.

代码语言:javascript
复制
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 --这可能更快,但您需要从经验上发现:

代码语言:javascript
复制
// 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();
    });
}
票数 10
EN

Stack Overflow用户

发布于 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)支付。

今天晚些时候,我将能够做一些实际的代码/测试。如果我学到什么新的东西,我会在这里发帖子。祝你好运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28934448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档