4

我从事多租户 Web 应用程序。有必要清除一些用户容器,这些容器可能相当大,收集了许多文档。我需要能够删除许多文档,例如:

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

在某些情况下,可能有许多文档符合此标准,例如成百上千甚至几百万。我担心此操作可能会花费很多时间并限制服务器。如果有很多文档,是否值得将此类操作排队以离线删除它们,例如伪代码:

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

我想知道在这种情况下如何通过 mongodb 中较小的部分删除数据。我还注意到,由于某种原因,删除相当多的行在 mongodb 中发生得相当快,我们有在 mongodb 中存储数据的原型,在 mysql 中删除相似数量的行需要更长的时间,但在 mysql 中,表中的每一行都有对其他表的引用有数据,但即使从属表中没有记录,在 mongodb 中似乎要快得多,在 mongodb 中,它将所有数据存储在文档中,但无论如何对我来说似乎很奇怪。或者它可能是多余的?

谢谢你。

4

1 回答 1

6

这是您必须在应用程序中执行的操作。在 PHP 中,您可以执行以下操作:

$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)可能会使事情变得非常缓慢。

于 2012-04-27T10:52:16.717 回答