2010-07-29 5 views
363

Я занимаюсь разработкой на MongoDB. Для совершенно не злых целей я иногда хочу сдуть все в базе данных, т. Е. Удалить каждую отдельную коллекцию и все остальное, что может быть вокруг, и начать с нуля. Есть ли одна строка кода, которая позволит мне это сделать? Бонусные баллы за предоставление как метода консоли MongoDB, так и метода драйвера MongoDB Ruby.Удалить все в базе данных MongoDB

ответ

492

В MONGO оболочки:

use [database]; 
db.dropDatabase(); 

Ruby code is pretty similar.

+34

Примечание: Это не приведет к удалению базы данных, а только к ее содержимому. – connorbode

+13

@connorbode Спасибо. Я прочитал его и сразу же: ** «B-But OP не хочет удалять базу данных!» **. Очень вводящая в заблуждение команда! –

+0

Следует использовать с осторожностью: если вы находитесь в оштукатуренной среде с помощью wiredTiger, и у вас нет базы данных пользователей, и вы вызываете dropDatabase, база данных будет удалена и может появляться как первичная на другом осколке при добавлении новых записей. –

98

Кроме того, из командной строки:

mongo DATABASE_NAME --eval "db.dropDatabase();" 
+1

Я не верю, что это работает в 2.4.6. Мои записи все еще существуют. –

8

Использование

[databaseName] 
db.Drop+databaseName(); 

drop collection 

use databaseName 
db.collectionName.drop(); 
9

Hear некоторые используют полные операции удаления для MongoDB с использованием Монго оболочки

Чтобы удалить конкретный документ в коллекциях: db.mycollection.remove({name:"stack"})

Чтобы удалить все документы в коллектор ctions: db.mycollection.remove()

Для удаления коллекции: db.mycollection.drop()

для удаления базы данных: первым идти в эту базу данных use mydb командой, а затем

db.dropDatabase() 
48

У меня была такая же проблема, когда мне нужно сбросить все коллекции, но не захотели потерять пользователей базы данных. Используйте следующую строку кода, если вы хотите сохранить конфигурацию пользователя для базы данных:

use <whichever database> 
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db[c].drop(); }) 

Этот код будет проходить через все имена коллекции из одной базы данных и падение те, которые не начинаются с «системой». ,

+2

Как упоминалось в @DanH, вы можете найти более надежным использование 'remove' вместо' drop'. Опция 'remove', как представляется, поддерживает ограничения на поля, которые вы очищаете. Когда мы использовали метод «drop», ограничение 'unique' на одном из наших полей не было выполнено после падения. – Scottymac

+0

@Scottymac - еще лучше добавьте ветку 'else' (в' if (c.indexOf ("system.") == -1) '), которая вместо' drop' выполняет 'remove'. Таким образом, вы не останетесь с пустыми коллекциями, если вы больше не используете их. –

+0

Лучше, чем 'db [c]', используйте 'db.getCollection (c)', который избегает [ошибок, когда имена коллекции являются цифрами] (http: //stackoverflow.com/a/24657123/70170). –

4

, если вы хотите удалить только базу данных и ее суб-коллекции использовать это:

  • use <database name>;
  • db.dropDatabase();

, если вы хотите удалить все базы данных в Монго затем использовать :

db.adminCommand("listDatabases").databases.forEach(function(d) 
      { 
       if(d.name!="admin" && d.name!="local" && d.name!="config") 
       { 
       db.getSiblingDB(d.name).dropDatabase(); 
       } 
      } 
     ); 
+0

Отличный ответ ... это, вероятно, то, что пользователь получал по адресу – robert

27

Я следовал за db.dropDatabase() в течение длительного времени, однако, если вы пытаетесь использовать это для очистки базы данных между тестовыми примерами, вы, возможно, в конечном итоге найдете проблемы с ограничениями индекса, которые не будут соблюдаться после падения базы данных.В результате, вы будете должны возиться с ensureIndexes, или более простой маршрут будет избежать dropDatabase отбрасываются, просто удалив из каждой коллекции в цикле, такие как:

db.getCollectionNames().forEach(
    function(collection_name) { 
    db[collection_name].remove() 
    } 
); 

В моем случае я бегу из командной строки с помощью:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});" 
+0

. Спасибо за это предложение, мы использовали' db [collection_name] .drop() 'и он показывал те же проблемы вы описали метод 'db.dropDatabase()'. Переключение 's/drop/remove /' работало блестяще! – Scottymac

+4

Я обнаружил, что 'remove()' не работает на MongoDB для Windows, и вместо этого мне нужно было выполнить 'remove ({})', который работает как на OSX, так и на Windows. – DanH

+0

Спасибо за отзыв, мы находимся на платформе Linux, но это стоит посмотреть немного дальше. – Scottymac

13

путем составления ответов от @Robse и @DanH (! престижность), я получил следующее решение, которое полностью удовлетворяет меня:

db.getCollectionNames().forEach(function(collection_name) { 
    if (collection_name.indexOf("system.") == -1) 
     db[collection_name].drop(); 
    else 
     db.collection_name.remove({}); 
}); 

Подключитесь к базе данных, запустите код.

Он очищает базу данных, отбрасывая пользовательские коллекции и опуская коллекцию системы.

+0

Это работает очень хорошо. Именно то, что мне нужно. –

1

Простейший способ удалить базу данных говорят блог:

> use blog 
switched to db blog 
> db.dropDatabase(); 
{ "dropped" : "blog", "ok" : 1 } 
1

Для разработчиков Метеор.

  1. Открыть второе окно терминала во время работы вашего приложения в localhost:3000.

  2. В папке вашего проекта, meteor mongo.

    coolName = new Mongo.Collection('yourCollectionName');

  3. Затем просто введите db.yourCollectionName.drop();

  4. Вы автоматически видеть изменения в локальном сервере.

Для всех остальных.

db.yourCollectionName.drop();

0

Чтобы удалить все блоки данных используют:

for i in $(mongo --quiet --host $HOSTNAME --eval "db.getMongo().getDBNames()" | tr "," " "); 

do mongo $i --host $HOSTNAME --eval "db.dropDatabase()"; 

done 
0
use <dbname> 
db.dropAllUsers() 
db.dropAllRoles() 
db.dropDatabase() 

MongoDB db.dropDatabase() documentation объяснения изменения, введенные в 2.6:

Изменено в версии 2.6: Эта команда не удаляет пользователей, связанных с текущей базой данных.

1
  1. Перечислите все доступные д.б.н. показать д.б.н.
  2. Выберите необходимый дб использования
  3. Отбросьте базу данных дб.dropDatabase() // Несколько дополнительных команд
  4. Список всех коллекций, доступных в БД шоу коллекций
  5. Удалить коллекцию спецификация db.collection.drop()

Надежда, что помогает

Смежные вопросы