Löschen Sie alles in einer MongoDB-Datenbank


454

Ich entwickle MongoDB. Aus absolut bösen Gründen möchte ich manchmal alles in einer Datenbank wegblasen - das heißt, jede einzelne Sammlung und alles, was sonst noch herumliegt, löschen und von vorne beginnen. Gibt es eine einzige Codezeile, mit der ich dies tun kann? Bonuspunkte für die Vergabe einer MongoDB-Konsolenmethode und einer MongoDB Ruby-Treibermethode.

Antworten:


587

In der Mongo-Muschel:

use [database];
db.dropDatabase();

Und um die Benutzer zu entfernen:

db.dropAllUsers();

23
@connorbode Danke dafür. Ich habe es gelesen und sofort: "B-aber OP will die Datenbank nicht entfernen!" . Sehr irreführender Befehl !!
Henrique Miranda

Mit Vorsicht verwenden: Wenn Sie sich mit wiredTiger in einer Sharded-Umgebung befinden und keine Benutzerdatenbank haben und dropDatabase aufrufen, wird die Datenbank gelöscht und kann beim Hinzufügen neuer Datensätze auf einem anderen Shard erneut als primär angezeigt werden.
Jason R. Coombs

2
Dadurch wird der Benutzer, der an die zugehörige Datenbank angehängt ist, nicht gelöscht. Sie können es also manuell löschen. db.dropAllUsers();
Fırat KÜÇÜK

2
Beachten Sie, dass die Datenbank nach Verwendung des Befehls "use dbs" nicht angezeigt wird. Es ist jedoch da. Also keine Sorgen.
Wynshaft

@StepanYakovenko Wahrscheinlich müssen Sie sich mit der MongoDB-Instanz authentifizieren
Josh K

113

Auch von der Kommandozeile:

mongo DATABASE_NAME --eval "db.dropDatabase();"

5
Ich glaube nicht, dass dies in 2.4.6 funktioniert. Meine Unterlagen existieren noch.
Brandon Clark

Wird dies auch die Benutzer in der Datenbank fernsteuern?
Gert van den Berg

67

Ich hatte das gleiche Problem, als ich alle Sammlungen zurücksetzen musste, aber keine Datenbankbenutzer verlieren wollte. Verwenden Sie die folgende Codezeile, wenn Sie die Benutzerkonfiguration für die Datenbank speichern möchten:

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

Dieser Code durchsucht alle Sammlungsnamen aus einer Datenbank und löscht diejenigen, die nicht mit "system" beginnen.


2
Wie von @DanH erwähnt, ist es möglicherweise zuverlässiger, es removeanstelle von zu verwenden drop. Die removeOption scheint Einschränkungen für Felder in den Sammlungen beizubehalten, die Sie löschen. Als wir die dropMethode verwendeten, wurde die uniqueEinschränkung für eines unserer Felder nach dem Ablegen nicht berücksichtigt.
Scottymac

@Scottymac - noch besser, fügen Sie einen elseZweig (zum if (c.indexOf("system.") == -1)) hinzu, der dies removeanstelle von tut drop. Auf diese Weise bleiben Ihnen keine leeren Sammlungen mehr übrig, wenn Sie sie nicht mehr verwenden
Bogdan D,

1
Besser als db[c], Verwendung db.getCollection(c), die Fehler vermeidet , wenn Sammlungsnamen Ziffern sind .
Jason R. Coombs

1
Laut den Dokumenten löscht ein Befehl dropDatabase seit MongoDB 2.6 keine Benutzer, daher ist die akzeptierte Antwort wahrscheinlich vorzuziehen.
Jason R. Coombs

1
Wenn der Name der Sammlung numerisch ist, sollte dies stattdessen funktionieren:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu

35

Ich habe die db.dropDatabase()Route lange Zeit verfolgt. Wenn Sie jedoch versuchen, die Datenbank zwischen den Testfällen zu löschen, können Probleme auftreten, wenn Indexeinschränkungen nach dem Löschen der Datenbank nicht berücksichtigt werden. Infolgedessen müssen Sie entweder mit sureIndexes herumspielen, oder eine einfachere Route würde darin bestehen, die dropDatabase insgesamt zu vermeiden und sie einfach aus jeder Sammlung in einer Schleife zu entfernen, wie z.

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

In meinem Fall habe ich dies über die Befehlszeile ausgeführt, indem ich:

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

1
Vielen Dank für diesen Vorschlag, den wir verwendet haben db[collection_name].drop()und der dieselben Probleme aufwies, die Sie mit der db.dropDatabase()Methode beschrieben haben. Das Schalten s/drop/remove/hat hervorragend funktioniert!
Scottymac

10
Ich fand, dass remove()das unter MongoDB für Windows nicht gut funktioniert, und stattdessen musste ich das tun, remove({})was sowohl unter OSX als auch unter Windows funktioniert.
DanH

Vielen Dank für den Tipp, wir befinden uns auf einer Linux-Plattform, aber dies ist einen weiteren Blick wert.
Scottymac

2
Ich habe einen Fehler beim Löschen festgestellt - da db [Sammlungsname] .remove () keine Abfrage hat! Also muss es tatsächlich sein: db [Sammlungsname] .remove ({})
JoelParke

16

Durch das Zusammenstellen der Antworten von @Robse und @DanH (Lob!) Habe ich die folgende Lösung, die mich vollkommen zufriedenstellt:

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

Stellen Sie eine Verbindung zu Ihrer Datenbank her und führen Sie den Code aus.

Es bereinigt die Datenbank, indem die Benutzersammlungen gelöscht und die Systemsammlungen geleert werden.


Dieses Skript bereinigt alles in nur einer bestimmten Mongo-Datenbank. Es werden alle Sammlungen in dieser Datenbank gelöscht.
Staskrak

10

Hören Sie, einige verwenden vollständige Löschvorgänge für Mongodb mit Mongo Shell

So löschen Sie ein bestimmtes Dokument in Sammlungen: db.mycollection.remove( {name:"stack"} )

So löschen Sie alle Dokumente in Sammlungen: db.mycollection.remove()

So löschen Sie die Sammlung: db.mycollection.drop()

So löschen Sie die Datenbank: Gehen Sie zuerst per use mydbBefehl zu dieser Datenbank und dann

db.dropDatabase()

8

Verwenden

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();

7

für den Fall, dass Sie alles auf einmal löschen müssen: (Löschen Sie alle Datenbanken auf einmal)

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


5

Wenn Sie nur eine Datenbank und ihre Untersammlungen löschen möchten, verwenden Sie Folgendes:

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

Wenn Sie alle Datenbanken in Mongo löschen möchten, verwenden Sie Folgendes:

db.adminCommand("listDatabases").databases.forEach(function(d)
             {
              if(d.name!="admin" && d.name!="local" && d.name!="config")
                {
                 db.getSiblingDB(d.name).dropDatabase();
                }
             }
          );

Tolle Antwort ... das ist wahrscheinlich, was der Benutzer bekommen hat
Robert

1

Der einfachste Weg, eine Datenbank zu löschen, sagt Blog:

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

1

Für Meteor-Entwickler.

  1. Öffnen Sie ein zweites Terminalfenster, während Sie Ihre App ausführen localhost:3000.

  2. Führen Sie im Ordner Ihres Projekts Folgendes aus : meteor mongo.

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

  3. Dann einfach eingeben db.yourCollectionName.drop();

  4. Sie sehen automatisch die Änderungen auf Ihrem lokalen Server.

Für alle anderen.

db.yourCollectionName.drop();


1
  1. Listen Sie alle verfügbaren dbs show dbs auf
  2. Wählen Sie die gewünschte Datenbankverwendung
  3. Löschen Sie die Datenbank db.dropDatabase () // Einige zusätzliche Befehle
  4. Listen Sie alle Sammlungen auf, die in einer DB-Show-Sammlung verfügbar sind
  5. Entfernen Sie eine Spezifikationssammlung db.collection.drop ()

Ich hoffe, das hilft


1

ich bevorzuge

db.your_collection.remove({})

Über

db.your_collection.drop()

Wenn Ihre Sammlung eine spezielle Sammlung war, dh eine begrenzte Sammlung oder eine Sammlung mit einem Feld, das als eindeutig markiert ist, wird durch Löschen die Sammlung selbst gelöscht, und wenn die Sammlung erneut erstellt wird, handelt es sich um eine normale Sammlung. Sie müssen die Eigenschaften erneut definieren. Verwenden Sie remove()diese Option, um die Dokumente zu löschen, ohne die Sammlung zu entfernen und das Verhalten der Sammlung zu beeinträchtigen.


1
Gute Argumente. Es ist jedoch erwähnenswert, dass dies drop()nahezu augenblicklich erfolgt und remove({})Ihre Datenbank für Minuten oder Dutzende von Minuten sperrt (abhängig von der Sammlungsgröße).
Sergio Tulentsev

0

Um alle DBs zu löschen, verwenden Sie:

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

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

done 


0

In MongoDB 3.2 und höher wird Mongo().getDBNames()in der mongoShell eine Liste der Datenbanknamen auf dem Server ausgegeben:

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

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

Eine forEach()Schleife über das Array könnte dann aufrufen dropDatabase(), um alle aufgelisteten Datenbanken zu löschen. Optional können Sie einige wichtige Datenbanken überspringen, die Sie nicht löschen möchten. Zum Beispiel:

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

Beispiellauf:

> 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.