MongoDB скидає кожну базу даних


97

Мені хотілося б знати, чи є команда скидати всі бази даних з мого MongoDB?

Я знаю, якщо я хочу скинути лише одну таблицю даних, мені просто потрібно ввести ім'я бази даних, як код нижче, але я не хочу, щоб його вказували.

mongo DB_NAME --eval 'db.dropDatabase();'

Відповіді:


142

ви можете створити цикл javascript, який виконує завдання, а потім виконати його в монгоконсолі.

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

13
var mongo = db.getMongo(); mongo.getDBNames().forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });
tjmehta

3
Ви також можете просто скопіювати вставний код вище та ввести його на консолі mongo.
Вівек Панді

2
Це скинуло мої системні бази даних (Mongo, версія 2.4.3). Мені довелося перезапустити процес mongodb, щоб він знову запрацював.
Фелікс Шмідт,

7
Я думаю, коли хтось хоче скинути свої бази даних, він не хоче скидати внутрішні бази даних mongo, такі як адміністратор та локальні.
carlin.scott

Також, база даних config, де зберігаються транзакції.
Родріго Перейра Фрага

103

Спробуйте цю команду:

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'

1
Чудово працює, і вам не потрібно створювати для нього файл js. Приємно.
Ерік Хонн,

Який симетричний для його завантаження?
нха

Однією з проблем цього підходу, яку я щойно виявив, є те, що 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()})'"
perezmlal

Я пройшов через те саме питання і виявив, що це найкраще рішення для завдань автоматизації. Вам не хочеться писати нові файли та завантажувати їх у конвеєрі CI / CD, тому
однокласним

21

Ви також можете зробити це за допомогою простої команди 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.
Sachin Gupta

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();
    }
}

Тоді на оболонці монго ви можете просто зробити

dropDatabases()

З документів:

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


Я зробив оновлення, щоб виправити проблеми. Дякуємо, що завітали!
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

і всі бази даних (окрім адміністратора та локальних) будуть скинуті.

Ця відповідь є копією однієї ALoR, просто виправте падіння системних баз даних


4

Зробити це можна легко через офіційний драйвер c #:

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

var names = _mongoServer.GetDatabaseNames();
foreach (var name in names)
{
   _mongoServer.DropDatabase(name);
}

так, це може бути ідеєю, але я хочу зробити це без C #. (Ой, вибачте, я використав тег C # для цього запитання)
Джон

Ви можете створити цикл javascript, який виконує цю роботу, а потім виконати його в монгоконсолі.
ALoR

2
@AndrewOrsich та @JohnSmith я опублікував сценарій.
ALoR

1

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()'

Або ви можете розпочати сеанс монго на своєму терміналі та написати

db.dropDatabase()

Що абсолютно однаково.


Питання в тому, як скинути всі бази даних, а не окрему
Роб Х,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.