Видаліть усе з бази даних MongoDB


454

Я займаюся розробкою на MongoDB. Для цілком недобрих цілей, я іноді хочу зняти все з бази даних - тобто видалити кожну колекцію та все, що може лежати, і почати з нуля. Чи є один рядок коду, який дозволить мені це зробити? Бонусні бали за надання як консольного методу MongoDB, так і методу драйвера MongoDB Ruby.

Відповіді:


588

У оболонці монго:

use [database];
db.dropDatabase();

І щоб видалити користувачів:

db.dropAllUsers();

23
@connorbode Дякую за це. Я прочитав це і одразу ж: "B-But OP не хоче видаляти базу даних!" . Дуже оманлива команда !!
Анріке Міранда

Використовуйте з обережністю: якщо ви перебуваєте в затіненому середовищі, використовуючи wiredTiger, і у вас немає бази даних користувачів, і ви посилаєтеся на базу даних dropData, база даних буде видалена і може повторно з’явитися як основна в іншому фрагменті, коли будуть додані нові записи.
Джейсон Р. Кумбс

2
Це не видалить користувача, який приєднаний до пов’язаної бази даних. Тому ви можете видалити його вручну. db.dropAllUsers();
Fırat KÜÇÜK

2
Зауважте, що база даних не відображатиметься після використання команди "використовувати dbs". Однак він є. Отже, ніяких турбот.
Wynshaft

@StepanYakovenko Ймовірно, потрібно автентифікуватись із екземпляром MongoDB
Josh K


67

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

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

Цей код буде проходити через всі назви колекцій з однієї бази даних і видаляти ті, які не починаються із "системи".


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

@Scottymac - ще краще, додайте elseгілку (до if (c.indexOf("system.") == -1)), яка робить removeзамість drop. Таким чином, вам не залишиться порожніх колекцій, якщо ви їх більше не використовуєте
Богдан Д

1
Краще, ніж db[c]використовувати, db.getCollection(c)що дозволяє уникнути помилок, коли назви колекції - це цифри .
Джейсон Р. Кумбс

1
Згідно з документами , оскільки MongoDB 2.6 команда dropDatabase не видаляє користувачів, тому прийнята відповідь, ймовірно, є кращою.
Джейсон Р. Кумбс

1
Якщо назва колекції числова, то це має працювати замість цього:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Константин Гальбену

35

Я db.dropDatabase()довго дотримувався маршруту, однак, якщо ви намагаєтеся використовувати це для протирання бази даних між тестовими випадками, з часом у вас можуть виникнути проблеми з обмеженнями індексу, які не будуть виконані після падіння бази даних. Як результат, вам або доведеться заплутатися з secureIndexes, або більш простим маршрутом було б взагалі уникнути dropDatabase і просто видалити з кожної колекції в циклі, наприклад:

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

У моєму випадку я запускав це з командного рядка, використовуючи:

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

1
Дякую за цю пропозицію, яку ми використовували, db[collection_name].drop()і вона демонструвала ті самі проблеми, що ви описали із db.dropDatabase()методом. Переключення s/drop/remove/відпрацьованого блискуче!
Scottymac

10
Я виявив, що remove()це не добре працює на MongoDB для Windows, і замість цього мені потрібно було робити те, remove({})що працює як на OSX, так і на Windows.
DanH

Дякуємо за підказку, ми перебуваємо на платформі Linux, але це варто розглянути трохи далі.
Scottymac

2
Я помітив помилку для видалення - оскільки у db [collection_name] .remove () немає запиту! Тож насправді це має бути: db [collection_name] .remove ({})
JoelParke

16

Складаючи відповіді від @Robse та @DanH (kudos!), Я отримав таке рішення, яке мене повністю задовольняє:

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

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

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


Цей сценарій очищує все лише в одній конкретній базі даних Mongo. Він стирає всі колекції в цій базі даних.
staskrak

10

Почуйте, деякі операції повного видалення для mongodb використовують оболонку mongo

Щоб видалити конкретний документ із колекцій: db.mycollection.remove( {name:"stack"} )

Щоб видалити всі документи з колекцій: db.mycollection.remove()

Щоб видалити колекцію: db.mycollection.drop()

для видалення бази даних: спочатку перейдіть до цієї бази даних за use mydbкомандою, а потім

db.dropDatabase()


7

на випадок, якщо вам потрібно буде одразу все скинути: (одразу викиньте всі бази даних)

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


5

якщо ви хочете видалити лише базу даних та її під-колекції, скористайтеся цим:

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

Чудова відповідь ... це, мабуть, те, що користувач потрапляв
Роберт

1

Найпростіший спосіб видалення бази даних, наприклад, блог:

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

1

Для розробників Meteor.

  1. Під час роботи програми відкрийте друге вікно терміналу localhost:3000.

  2. В папці запуску вашого проекту, meteor mongo.

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

  3. Потім просто введіть db.yourCollectionName.drop();

  4. Ви автоматично побачите зміни на локальному сервері.

Для всіх інших.

db.yourCollectionName.drop();


1
  1. Перерахуйте всі доступні dbs show dbs
  2. Виберіть необхідне використання db
  3. Відкиньте базу даних db.dropDatabase () // Кілька додаткових команд
  4. Список усіх колекцій, доступних у колекціях db show
  5. Видалити колекцію специфікацій db.collection.drop ()

Сподіваюся, що це допомагає


1

я віддаю перевагу

db.your_collection.remove({})

над

db.your_collection.drop()

Якщо ваша колекція була спеціальною колекцією, тобто колекцією з обмеженим набором або колекцією з одним полем, позначеним як унікальне, видалення видалить саму колекцію, і коли колекція буде створена знову, це буде звичайна колекція. Вам доведеться знову визначити властивості. Тому використовуйте remove()для очищення документів, не виймаючи колекцію та не впливаючи на поведінку колекції.


1
Хороші бали. Варто згадати, що drop()це майже миттєво і remove({})фіксує ваш db хвилин або десятки хвилин (залежно від розміру колекції).
Серхіо Туленцев

0

Щоб видалити всі БД, використовуйте:

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

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

done 


0

У MongoDB 3.2 та новіших версіях Mongo().getDBNames()в mongoоболонці буде виведено список імен бази даних на сервері:

> Mongo().getDBNames()
[ "local", "test", "test2", "test3" ]

> show dbs
local  0.000GB
test   0.000GB
test2  0.000GB
test3  0.000GB

forEach()Перебираємо масив може потім викликати dropDatabase()падіння всіх перерахованих баз даних. За бажанням ви можете пропустити деякі важливі бази даних, які ви не хочете скидати. Наприклад:

Mongo().getDBNames().forEach(function(x) {
  // Loop through all database names
  if (['admin', 'config', 'local'].indexOf(x) < 0) {
    // Drop if database is not admin, config, or local
    Mongo().getDB(x).dropDatabase();
  }
})

Приклад виконання:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
test2   0.000GB
test3   0.000GB

> Mongo().getDBNames().forEach(function(x) {
...   if (['admin', 'config', 'local'].indexOf(x) < 0) {
...     Mongo().getDB(x).dropDatabase();
...   }
... })

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.