Я работаю над многопользовательским веб-приложением. Необходимо очистить некоторый контейнер пользователей, который может быть довольно большим, имея много документов в коллекции. Мне нужно удалить многие документы, например:
return self::remove(array('LISTID' => $listId), array('safe' => true));
В некоторых случаях может быть много документов, которые соответствуют этим критериям, примерно 100 или тысячи или даже миллионы. Я волнуюсь, что эта операция может занять много времени и отключить сервер. Если есть много документов, стоит ли в очереди такая операция, чтобы удалить их в автономном режиме, например, псевдокод:
while (there are documents) {
delete(1000 documents);
sleep();
}
Интересно, как в этом случае удалить данные меньшими портиками в mongodb. Я также замечаю, что по какой-то причине удаление нескольких строк происходит довольно быстро в mongodb, у нас есть прототип с хранением данных в mongodb, удаление такого количества строк занимает намного больше времени в mysql, но в mysql каждая строка в таблице имеет ссылки на другую таблицу с данными, но даже когда therer не является записями в зависимых таблицах, в mongodb он намного быстрее, в mongodb он хранит все данные в документе, но мне все равно кажется странным. Или, может быть, это лишнее?
Спасибо.
Это то, что вам нужно будет сделать в своем приложении. В 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)
может сделать вещи очень медленными.