удалить много документов из mongodb

4

Я работаю над многопользовательским веб-приложением. Необходимо очистить некоторый контейнер пользователей, который может быть довольно большим, имея много документов в коллекции. Мне нужно удалить многие документы, например:

    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 он хранит все данные в документе, но мне все равно кажется странным. Или, может быть, это лишнее?

Спасибо.

  • 0
    Сколько у вас арендаторов? Если их нет в тысячах, вы можете иметь коллекцию для каждого арендатора и отбросить всю коллекцию (если хотите, вы пытаетесь это сделать - удалить все данные для одного арендатора). Что бы вы ни делали, это почти наверняка является автономной, пакетной операцией.
  • 0
    Это могут быть десятки тысяч арендаторов и даже больше. Эта операция должна очистить данные одного списка, у арендаторов может быть несколько списков.
Теги:
mongodb-php

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) может сделать вещи очень медленными.

  • 1
    Разве нет способа ограничить количество удаленных документов в mongodb, как в какой-либо базе данных (например, mysql), в операции удаления.
  • 0
    Это единственный способ удалить документы меньшими порциями в mongodb?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню