Подтвердить что ты не робот

Усекать коллекцию

Как урезать коллекцию в MongoDB или есть такая вещь?

Сейчас я должен удалить сразу 6 больших коллекций, и я останавливаю сервер, удаляя файлы базы данных, а затем воссоздавая базу данных и коллекции в ней. Есть ли способ удалить данные и оставить коллекцию такой, какой она есть? Операция удаления занимает очень много времени. У меня есть миллионы записей в коллекциях.

4b9b3361

Ответ 1

Вы можете эффективно отбросить все данные и индексы для коллекции с помощью db.collection.drop(). Удаление коллекции с большим количеством документов и/или индексов будет значительно более эффективным, чем удаление всех документов с использованием db.collection.remove({}). Метод remove() выполняет дополнительные операции по обновлению индексов при удалении документов и будет даже медленнее в среде с набором реплик, где в журнал операций будут входить записи для каждого удаленного документа, а не одна команда удаления коллекции.

Пример использования оболочки mongo:

var dbName = 'nukeme';
db.getSiblingDB(dbName).getCollectionNames().forEach(function(collName) {
    // Drop all collections except system ones (indexes/profile)
    if (!collName.startsWith("system.")) {
        // Safety hat
        print("WARNING: going to drop ["+dbName+"."+collName+"] in 5s .. hit Ctrl-C if you've changed your mind!");
        sleep(5000);
        db[collName].drop();
    }
})

Стоит отметить, что удаление коллекции имеет разные результаты при использовании хранилища в зависимости от настроенного механизма хранения:

  • WiredTiger (механизм хранения по умолчанию в MongoDB 3.2 или новее) освободит пространство, используемое отброшенной коллекцией (и всеми связанными с ней индексами) после завершения удаления.
  • MMAPv1 (механизм хранения по умолчанию в MongoDB 3.0 и более ранних версиях) не освобождает предварительно выделенное дисковое пространство. Это может быть хорошо для вашего случая использования; свободное место доступно для повторного использования при вставке новых данных.

Если вместо этого вы удаляете базу данных, вам обычно не нужно явно создавать коллекции, поскольку они будут создаваться при вставке документов.

Тем не менее, вот пример удаления и воссоздания базы данных с одинаковыми именами коллекций в оболочке mongo:

var dbName = 'nukeme';

// Save the old collection names before dropping the DB
var oldNames = db.getSiblingDB(dbName).getCollectionNames();

// Safety hat
print("WARNING: going to drop ["+dbName+"] in 5s .. hit Ctrl-C if you've changed your mind!")
sleep(5000)

db.getSiblingDB(dbName).dropDatabase();

// Recreate database with the same collection names
oldNames.forEach(function(collName) {
    db.getSiblingDB(dbName).createCollection(collName);
})

Ответ 2

Чтобы усечь коллекцию и сохранить индексы, используйте

 db.<collection>.remove({})

Ответ 3

приведенный ниже запрос удалит все записи в коллекциях и сохранит коллекцию как есть,

db.collectionname.remove({})

Ответ 4

Создайте базу данных и коллекции, а затем создайте резервную копию базы данных для файлов bson с помощью mongodump:

mongodump --db database-to-use

Затем, когда вам нужно сбросить базу данных и воссоздать предыдущую среду, просто используйте mongorestore:

mongorestore --drop

Резервная копия будет сохранена в текущем рабочем каталоге в папке с именем dump, когда вы используете команду mongodump.

Ответ 5

Не существует эквивалента операции "усечения" в MongoDB. Вы можете удалить все документы, но у него будет сложность O (n) или удалить коллекцию, тогда сложность будет O (1), но вы потеряете свои индексы.

Ответ 6

Метод db.drop() получает блокировку записи в поврежденной базе данных и блокирует другие операции до тех пор, пока не завершится.

Я думаю, что использование db.remove({}) лучше, чем db.drop().

Ответ 7

(просто информация)

Если вам нужно сделать это в Laravel, мы можем использовать это

ModelName::truncate();

Кроме того, мы можем использовать Mongo Compass (графический интерфейс для монго), отличный инструмент, который мы можем легко понять для такого рода операций.