Удалить все в базе данных 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
Джош К


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

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


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. Выберите необходимое использование БД
  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

В 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.