MongoDB удаляет каждую базу данных

97

Я хотел бы знать, есть ли команда для удаления всех баз данных из моей MongoDB?

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

mongo DB_NAME --eval 'db.dropDatabase();'
Джон
источник

Ответы:

143

вы можете создать цикл javascript, который выполняет задание, а затем выполнить его в mongoconsole.

var dbs = db.getMongo().getDBNames()
for(var i in dbs){
    db = db.getMongo().getDB( dbs[i] );
    print( "dropping db " + db.getName() );
    db.dropDatabase();
}

сохраните его в dropall.js, а затем выполните:

mongo dropall.js
ALoR
источник
13
var mongo = db.getMongo(); mongo.getDBNames().forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });
tjmehta
3
Вы также можете просто скопировать вставку вышеуказанного кода и ввести его в консоли mongo.
Вивек Пандей
2
Это удалило мои системные базы данных (Mongo Version 2.4.3). Мне пришлось перезапустить процесс mongodb, чтобы он снова заработал.
Феликс Шмидт
7
Я думаю, что когда кто-то хочет отказаться от своих баз данных, они не хотят отказываться от внутренних баз данных mongo, таких как admin и local.
carlin.scott
А также база данных конфигурации, в которой хранятся транзакции.
Родриго Перейра Фрага,
103

Попробуйте эту команду:

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
кев
источник
1
Отлично работает, и вам не нужно создавать для него файл js. Ницца.
Эрик Хонн
Какая симметрия для его загрузки?
nha
Одна проблема с этим подходом, которую я только что обнаружил, заключается в том, что db var сохраняется в сеансах консоли mongo, поэтому, если кто-то взаимодействует с одной из баз данных, он будет исключен вызовом db.getSiblingDB.
carlin.scott
3
Ницца. Это идеально подходит для Docker: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
перезмл
Я прошел через ту же проблему и обнаружил, что это лучшее решение для задач автоматизации. Вы не стремитесь писать новые файлы и загружать их в конвейер CI / CD, поэтому однострочным скриптом очень просто управлять
Кармин Ингальди,
22

Вы также можете сделать это с помощью простой команды mongo:

db.adminCommand("listDatabases").databases.forEach( function (d) {
    if (d.name != "local" && d.name != "admin"  && d.name != "apiomat"  && d.name != "config")
        db.getSiblingDB(d.name).dropDatabase();
 })
Андреас
источник
Вместо того, чтобы писать условие if для каждой БД, мы можем просто поместить в массив и выполнить indexOf.
Сачин Гупта
5

Добавляя к ответу @ ALoR, для удобства вы можете поместить следующее в ~ / .mongorc.js

function dropDatabases(){
    var mongo = db.getMongo();

    var dbNames = mongo.getDBNames();
    for (var i = 0; i < dbNames.length; i++) {
        var db = mongo.getDB( dbNames[i] );

        print( "Dropping database " + db.getName() + "..." );
        db.dropDatabase();
    }
}

Тогда в оболочке mongo вы можете просто сделать

dropDatabases()

Из документов:

Mongo прочитает файл .mongorc.js из домашнего каталога пользователя, вызывающего mongo. В этом файле пользователи могут определять переменные, настраивать приглашение оболочки mongo или обновлять информацию, которую они хотели бы обновлять каждый раз при запуске оболочки.

Btiernay
источник
Я сделал обновления, чтобы исправить проблемы. Спасибо за участие!
btiernay
5

Сохраните это в drop_all_dbs.js:

var databases = db.getMongo().getDBNames()
for(var i in databases){
    db = db.getMongo().getDB( databases[i] );
    if(db.getName() == "admin" || db.getName() == "local"){
        print("skipping db " + db.getName())
        continue
    }
    print( "dropping db " + db.getName() );
    db.dropDatabase();
}

Теперь вы можете выполнить:

mongo drop_all_dbs.js

и все базы данных (кроме admin и local) будут удалены.

Этот ответ является копией ответа ALoR, просто исправьте падение системных dbs

Газ
источник
4

Вы можете сделать это легко с помощью официального драйвера C #:

var _mongoServer = MongoServer.Create("mongodb://localhost:27020");

var names = _mongoServer.GetDatabaseNames();
foreach (var name in names)
{
   _mongoServer.DropDatabase(name);
}
Эндрю Орсич
источник
да, это может быть идея, но я хочу обойтись без C #. (Ой, извините, я использовал тег C # для этого вопроса)
John
вы можете создать цикл javascript, который выполняет задание, а затем выполнить его в mongoconsole.
ALoR
2
@AndrewOrsich и @JohnSmith я опубликовал сценарий.
ALoR
2

var mongo = db.getMongo(); mongo.getDBNames().filter(n => n != 'admin' && n != 'local' && n != 'config').forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });

Это безопасно копировать и выполнять на mongoshell. Кредиты на все ответы выше. Просто исключите также базу данных config.

вю ле
источник
-2

Это так же просто, как

mongo --eval 'db.dropDatabase()'

Или вы можете запустить сеанс mongo на своем терминале и написать

db.dropDatabase()

Что в точности то же самое.

Педро Хосе Пикеро Плаза
источник
Вопрос в том, как удалить все базы данных, а не отдельную
Роб Х.