Удалить все в базе данных MongoDB

454

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

Тревор Бернхэм
источник

Ответы:

588

В оболочке монго:

use [database];
db.dropDatabase();

И удалить пользователей:

db.dropAllUsers();
Джош К
источник
23
@connorbode Спасибо за это. Я прочитал это и сразу же: "B-Но OP не хочет удалять базу данных!" , Очень вводящая в заблуждение команда !!
Энрике Миранда
Используйте с осторожностью: если вы находитесь в изолированной среде с использованием wiredTiger, и у вас нет пользовательской базы данных, и вы вызываете dropDatabase, база данных будет удалена и может вновь появиться в качестве основной в другом сегменте при добавлении новых записей.
Джейсон Р. Кумбс
2
Это не удалит пользователя, который присоединен к связанной базе данных. Поэтому вы можете удалить его вручную. db.dropAllUsers();
Fırat KÜÇÜK
2
Обратите внимание, что база данных не будет отображаться после использования команды «use dbs». Тем не менее, это там. Так что не беспокойся.
wynshaft
@StepanYakovenko Вероятно, необходимо пройти проверку подлинности с экземпляром MongoDB
Джош К
114

Также из командной строки:

mongo DATABASE_NAME --eval "db.dropDatabase();"
Rimian
источник
5
Я не верю, что это работает в 2.4.6. Мои записи все еще существуют.
Брэндон Кларк
Будет ли это также удалять пользователей в базе данных?
Герт ван ден Берг
67

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

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

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

Геринг
источник
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()долго следовал по маршруту, однако, если вы пытаетесь использовать это для очистки базы данных между тестами, вы можете в конечном итоге обнаружить проблемы с ограничениями индекса, которые не соблюдаются после удаления базы данных. В результате вам нужно будет либо возиться с sureIndexes, либо более простой маршрут позволит полностью избежать dropDatabase и просто удалить из каждой коллекции в цикле, например:

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

В моем случае я запускал это из командной строки, используя:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"
Danh
источник
1
Спасибо за это предложение, которое мы использовали, db[collection_name].drop()и оно показывало те же проблемы, которые вы описали с помощью db.dropDatabase()метода. Переключение s/drop/remove/сработало блестяще!
Scottymac
10
Я обнаружил, что remove()это не очень хорошо работает на MongoDB для Windows, и вместо этого мне нужно было сделать то, remove({})что работает как на OSX, так и на Windows.
ДанХ
Спасибо за совет, мы находимся на платформе Linux, но это стоит посмотреть немного дальше.
Скоттимак
2
Я заметил ошибку для удаления - поскольку db [collection_name] .remove () не имеет запроса! Так что на самом деле это должно быть: db [collection_name] .remove ({})
JoelParke
16

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

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()
BHV
источник
8

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

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();
Мохамед Эль Гамаль
источник
7

в случае, если вам нужно отбросить все сразу: (отбросить все базы данных одновременно)

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
sjas
источник
7
db.getCollectionNames().forEach(c=>db[c].drop())
Сельвакумар Поннусамы
источник
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. Выберите необходимое использование БД
  3. Удалить базу данных db.dropDatabase () // Несколько дополнительных команд
  4. Перечислите все коллекции, доступные в db show collection
  5. Удалить коллекцию спецификаций db.collection.drop ()

надеюсь, это поможет

Прия Радж
источник
1

я предпочитаю

db.your_collection.remove({})

над

db.your_collection.drop()

Если ваша коллекция была специальной коллекцией, то есть закрытой коллекцией или коллекцией с одним полем, помеченным как уникальное, удаление удалит саму коллекцию, а когда коллекция будет создана снова, это будет обычная коллекция. Вы должны будете снова определить свойства. Поэтому используйте remove()для очистки документов, не удаляя коллекцию и не влияя на поведение коллекции.

Срираг А.Р.
источник
1
Хорошие моменты. Однако стоит упомянуть, что drop()это почти мгновенно и remove({})блокирует вашу базу данных на минуты или десятки минут (в зависимости от размера коллекции).
Серхио Туленцев
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 () документация, объясняющая модификацию, представленную в 2.6:

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

Антонио Бардацци
источник
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
kevinadi
источник