2012-04-27 92 views
3

我在多租户Web应用程序上工作。有必要清除一些容器的用户,这些容器可能相当大,有许多文档正在收集。 我需要能够删除许多文件是这样的:从mongodb中删除很多文档

return self::remove(array('LISTID' => $listId), array('safe' => true)); 

在某些情况下可以有许多文件符合这一标准,类似的十万甚至上百万100S。我担心这个操作可能会花费很多时间和节制服务器。 如果有很多文件,是否值得排队这样的操作将其删除脱机像伪代码:

while (there are documents) { 
    delete(1000 documents); 
    sleep(); 
} 

我不知道如何通过小portios MongoDB中在这种情况下删除数据。我还注意到,由于某种原因,在mongodb中删除相当多的行的速度相当快,我们有用mongodb存储数据的原型,在mysql中删除相似数量的行需要更长的时间,但在mysql中,表中的每一行都引用了其他表有了数据,但即使在依赖表中没有记录时,它在mongodb中似乎也快得多,在mongodb中,它将所有数据存储在文档中,但对我而言,似乎相当奇怪。 或者它可能是多余的?

谢谢。

+0

你有几个租户?如果他们不是成千上万,你可以为每个租户收集一个集合并丢弃整个集合(如果你想要做的是删除一个租户的所有数据)。不管你做什么,这几乎肯定是一种离线的批量式操作。 – Thilo 2012-04-27 06:16:20

+0

它可以成千上万的租户,甚至更多。此操作应清除一个列表的数据,租户可以有多个列表。 – Oleg 2012-04-27 07:22:18

回答

5

这是你必须在你的应用程序中做的事情。在PHP中,你可以f.e.这样做:

$found = false; 
$ids = $collection->find(array('LISTID' => $listId), array('_id' => 1))->limit(1000); 
do { 
    $found = 0; 
    $idsToDelete = array(); // we'll collect all the ids here, so that we can delete them in a batch 
    foreach($ids as $res) 
    { 
     $found++; 
     $idsToDelete[] = $res['_id']; 
    } 
    $collection->remove(array('_id' => array('$in' => $idsToDelete))); 
    sleep(15); 
} while ($found); 

你需要让真正确保您有LISTID索引,否则find(array('LISTID' => $listId)可能使事情变得很慢。

+1

是否有办法限制MongoDB中删除文件的数量,如某些数据库(例如mysql)在删除操作中的限制。 – Oleg 2012-04-27 13:24:39

+0

这是在mongodb中用小块删除文档的唯一方法吗? – Oleg 2012-04-27 13:31:10

+0

目前删除没有限制,所以这确实是我能想到的唯一方法。 – Derick 2012-04-28 09:27:21