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.

Odpowiedzi:


587

W skorupce mangowej:

use [database];
db.dropDatabase();

Aby usunąć użytkowników:

db.dropAllUsers();

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

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


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

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.


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

8

Posługiwać się

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();

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


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

Ś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 }

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


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


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.


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 


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.