Usuń wszystko z bazy danych MongoDB

454

Robię programowanie na MongoDB. Zupełnie nie-złych celów czasami chcę wysadzić wszystko w bazie danych - to znaczy usunąć każdą kolekcję i wszystko, co może leżeć, i zacząć od zera. Czy jest jeden wiersz kodu, który pozwoli mi to zrobić? Punkty bonusowe za podanie zarówno metody konsoli MongoDB, jak i metody sterownika Ruby MongoDB.

Trevor Burnham
źródło

Odpowiedzi:

587

W skorupce mangowej:

use [database];
db.dropDatabase();

Aby usunąć użytkowników:

db.dropAllUsers();
Josh K.
źródło
23
@connorbode Dzięki za to. Przeczytałem go i od razu: „B-Ale OP nie chce usunąć bazy danych!” . Bardzo mylące polecenie !!
Henrique Miranda
Używaj z rozwagą: jeśli jesteś w odłamkowym środowisku korzystającym z wiredTiger i nie masz bazy danych użytkowników i wywołujesz dropDatabase, baza danych zostanie usunięta i może ponownie pojawić się jako podstawowa na innym fragmencie po dodaniu nowych rekordów.
Jason R. Coombs
2
Nie spowoduje to usunięcia użytkownika podłączonego do powiązanej bazy danych. Możesz więc usunąć go ręcznie. db.dropAllUsers();
Fırat KÜÇÜK
2
Zauważ, że baza danych nie wyświetli się po użyciu polecenia „use dbs”. Jest jednak tam. Więc nie martw się.
wynshaft,
@StepanYakovenko Prawdopodobnie trzeba uwierzytelnić się za pomocą instancji MongoDB
Josh K
113

Ponadto z wiersza poleceń:

mongo DATABASE_NAME --eval "db.dropDatabase();"
Rimian
źródło
5
Nie wierzę, że to działa w 2.4.6. Moje zapisy wciąż istnieją.
Brandon Clark,
Czy to zdalnie zdejmie także użytkowników bazy danych?
Gert van den Berg
67

Miałem ten sam problem, kiedy musiałem zresetować wszystkie kolekcje, ale nie chciałem stracić żadnych użytkowników bazy danych. Użyj poniższej linii kodu, jeśli chcesz zapisać konfigurację użytkownika dla bazy danych:

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

Ten kod przejdzie przez wszystkie nazwy kolekcji z jednej bazy danych i usunie te, które nie zaczynają się na „system”.

Gering
źródło
2
Jak wspomniano @DanH, może być bardziej niezawodne w użyciu removezamiast drop. Ta removeopcja wydaje się utrzymywać ograniczenia na polach kolekcji, które usuwasz. Kiedy zastosowaliśmy tę dropmetodę, uniqueograniczenie na jednym z naszych pól nie było przestrzegane po upuszczeniu.
Scottymac,
@Scottymac - jeszcze lepiej, dodaj elsegałąź (do if (c.indexOf("system.") == -1)), która robi removezamiast drop. W ten sposób nie masz już pustych kolekcji, jeśli już ich nie używasz
Bogdan D
1
Lepiej niż db[c], użyj, aby db.getCollection(c)uniknąć błędów, gdy nazwy kolekcji są cyframi .
Jason R. Coombs
1
Według dokumentacji , od MongoDB 2.6, polecenie dropDatabase nie usuwa użytkowników, więc zaakceptowana odpowiedź jest prawdopodobnie lepsza.
Jason R. Coombs
1
Jeśli nazwa kolekcji ma db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
postać
35

db.dropDatabase()Długo podążałem tą trasą, ale jeśli próbujesz użyć tego do czyszczenia bazy danych między przypadkami testowymi, możesz w końcu znaleźć problemy z ograniczeniami indeksu, które nie są uwzględniane po upuszczeniu bazy danych. W rezultacie musisz albo zadzierać z zapewnieniem wskaźnikówIndeksy, albo prostszą trasą byłoby całkowite uniknięcie dropDatabase i po prostu usunięcie z każdej kolekcji w pętli, takiej jak:

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

W moim przypadku uruchomiłem to z wiersza polecenia, używając:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"
DanH
źródło
1
Dziękujemy za tę sugestię, której używaliśmy db[collection_name].drop()i wykazywała te same problemy, które opisałeś za pomocą tej db.dropDatabase()metody. Wspaniale przełącza się s/drop/remove/!
Scottymac,
10
Odkryłem, że remove()nie działa dobrze w MongoDB dla Windows, a zamiast tego musiałem zrobić, remove({})który działa zarówno w OSX, jak i Windows.
DanH
Dzięki za wskazówkę, jesteśmy na platformie Linux, ale warto zajrzeć trochę dalej.
Scottymac,
2
Zauważyłem błąd podczas usuwania - ponieważ db [nazwa_kolekcji] .remove () nie ma zapytania! Więc tak naprawdę musi to być: db [nazwa_kolekcji] .remove ({})
JoelParke,
16

Kompilując odpowiedzi od @Robse i @DanH (kudos!), Otrzymałem następujące rozwiązanie, które całkowicie mnie satysfakcjonuje:

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

Połącz się z bazą danych, uruchom kod.

Czyści bazę danych, usuwając kolekcje użytkowników i opróżniając kolekcje systemowe.

Bogdan D.
źródło
Ten skrypt czyści wszystko w ramach jednej konkretnej bazy danych Mongo. Usuwa wszystkie kolekcje w tej bazie danych.
staskrak
10

Posłuchaj, niektóre z nich używają operacji pełnego usunięcia dla mongodb przy użyciu powłoki mongo

Aby usunąć określony dokument ze zbiorów: db.mycollection.remove( {name:"stack"} )

Aby usunąć wszystkie dokumenty ze zbiorów: db.mycollection.remove()

Aby usunąć kolekcję: db.mycollection.drop()

aby usunąć bazę danych: najpierw przejdź do tej bazy danych za pomocą use mydbpolecenia, a następnie

db.dropDatabase()
bhv
źródło
8

Posługiwać się

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();
Mohamed El Gamal
źródło
7

na wypadek gdybyś musiał upuścić wszystko na raz: (upuść wszystkie bazy danych na raz)

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
sjas
źródło
6
db.getCollectionNames().forEach(c=>db[c].drop())
Selvakumar Ponnusamy
źródło
5

jeśli chcesz usunąć tylko bazę danych i jej podkolekcje, użyj tego:

  • use <database name>;
  • db.dropDatabase();

jeśli chcesz usunąć wszystkie bazy danych w Mongo, użyj tego:

db.adminCommand("listDatabases").databases.forEach(function(d)
             {
              if(d.name!="admin" && d.name!="local" && d.name!="config")
                {
                 db.getSiblingDB(d.name).dropDatabase();
                }
             }
          );
Stéphane Bruckert
źródło
Świetna odpowiedź ... prawdopodobnie do tego zmierzał użytkownik
Robert
1

Najprostszym sposobem na usunięcie bazy danych jest blog:

> use blog
switched to db blog
> db.dropDatabase();
{ "dropped" : "blog", "ok" : 1 }
Shalabh Raizada
źródło
1

Dla programistów Meteor.

  1. Otwórz drugie okno terminala podczas uruchamiania aplikacji localhost:3000.

  2. W perspektywie folderu Twojego projektu, meteor mongo.

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

  3. Następnie wystarczy wejść db.yourCollectionName.drop();

  4. Automatycznie zobaczysz zmiany na lokalnym serwerze.

Dla wszystkich innych.

db.yourCollectionName.drop();

Felipe Alarcon
źródło
1
  1. Wymień wszystkie dostępne dbs pokaż dbs
  2. Wybierz niezbędne użycie bazy danych
  3. Upuść bazę danych db.dropDatabase () // Kilka dodatkowych poleceń
  4. Wyświetl wszystkie kolekcje dostępne w kolekcjach db db show
  5. Usuń kolekcję specyfikacji db.collection.drop ()

Mam nadzieję, że to pomaga

priya raj
źródło
1

wolę

db.your_collection.remove({})

nad

db.your_collection.drop()

Jeśli twoja kolekcja była kolekcją specjalną, tj. Kolekcją zamkniętą lub kolekcją z jednym polem oznaczonym jako unikalna, upuszczenie wyczyści samą kolekcję, a kiedy kolekcja zostanie ponownie utworzona, będzie to zwykła kolekcja. Będziesz musiał ponownie zdefiniować właściwości. Użyj więc, remove()aby wyczyścić dokumenty bez usuwania kolekcji i wpływając na zachowanie kolekcji.

Sreeragh AR
źródło
1
Słuszne uwagi. Warto jednak wspomnieć, że drop()jest to prawie natychmiastowe i remove({})blokuje db na kilka minut lub dziesiątki minut (w zależności od wielkości kolekcji).
Sergio Tulentsev
0

Aby usunąć wszystkie bazy danych, użyj:

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

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

done 
Zaur
źródło
0
use <dbname>
db.dropAllUsers()
db.dropAllRoles()
db.dropDatabase()

Dokumentacja MongoDB db.dropDatabase () wyjaśniająca modyfikację wprowadzoną w 2.6:

Zmieniono w wersji 2.6: To polecenie nie usuwa użytkowników powiązanych z bieżącą bazą danych.

Antonio Bardazzi
źródło
0

W MongoDB 3.2 i nowszych, Mongo().getDBNames()w mongomuszli wyjścia woli listy nazw baz danych na serwerze:

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

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

forEach()Pętli na matrycę może następnie wywołać dropDatabase()spadek wszystkich wymienionych baz danych. Opcjonalnie możesz pominąć niektóre ważne bazy danych, których nie chcesz upuszczać. Na przykład:

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

Przykładowy przebieg:

> 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
źródło