532 Stimmen

Alles in einer MongoDB-Datenbank löschen

Ich entwickle mit MongoDB. Aus ganz und gar nicht bösen Gründen möchte ich manchmal alles in einer Datenbank löschen, d. h. jede einzelne Auflistung und alles, was sonst noch so herumliegt, und von vorne anfangen. Gibt es eine einzige Codezeile, mit der ich das tun kann? Bonuspunkte für die Angabe sowohl einer MongoDB-Konsolenmethode als auch einer MongoDB-Ruby-Treibermethode.

671voto

Josh K Punkte 27354

In der Mongo-Shell:

use [database];
db.dropDatabase();

Und um die Benutzer zu entfernen:

db.dropAllUsers();

36 Stimmen

@connorbode Vielen Dank für diese Information. Ich habe es gelesen und sofort durchdacht: "Aber OP will die Datenbank nicht löschen!" . Sehr irreführender Befehl!

1 Stimmen

Seien Sie vorsichtig: Wenn Sie in einer Sharded-Umgebung mit wiredTiger sind und keine Benutzerdatenbank haben und dropDatabase aufrufen, wird die Datenbank gelöscht und könnte als primäre Datenbank auf einem anderen Shard wieder auftauchen, wenn neue Datensätze hinzugefügt werden.

5 Stimmen

Dadurch wird der Benutzer, der mit der entsprechenden Datenbank verbunden ist, nicht gelöscht. Sie sollten ihn daher manuell löschen. db.dropAllUsers();

129voto

Rimian Punkte 34365

Auch über die Befehlszeile:

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

6 Stimmen

Ich glaube nicht, dass dies in 2.4.6 funktioniert. Meine Datensätze existieren immer noch.

0 Stimmen

Werden dadurch auch die Benutzer in der Datenbank entfernt?

83voto

Gering Punkte 2380

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 geht alle Sammlungsnamen einer Datenbank durch und löscht alle, die nicht mit "system" beginnen.

3 Stimmen

Wie bereits von @DanH erwähnt, ist es vielleicht zuverlässiger, wenn Sie remove anstelle von drop . Die remove scheint Beschränkungen für Felder in den zu löschenden Sammlungen beizubehalten. Als wir die Option drop Methode, die unique Die Beschränkung auf einem unserer Felder wurde nach der Übergabe nicht eingehalten.

1 Stimmen

@Scottymac - besser noch, fügen Sie ein else Zweig (zum if (c.indexOf("system.") == -1) ), die die remove anstelle von drop . Auf diese Weise bleiben keine leeren Sammlungen übrig, wenn Sie sie nicht mehr verwenden.

4 Stimmen

Besser als db[c] verwenden db.getCollection(c) was vermeidet Fehler bei Sammlungsnamen mit Ziffern .

45voto

DanH Punkte 4938

Ich habe die db.dropDatabase() Wenn Sie jedoch versuchen, dies für das Löschen der Datenbank zwischen den Testfällen zu verwenden, werden Sie möglicherweise Probleme mit Indexeinschränkungen haben, die nach dem Löschen der Datenbank nicht beachtet werden. Infolgedessen müssen Sie entweder mit ensureIndexes herumspielen, oder ein einfacherer Weg wäre, dropDatabase ganz zu vermeiden und nur aus jeder Sammlung in einer Schleife wie zu entfernen:

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

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

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

2 Stimmen

Vielen Dank für diese Anregung, wir haben die db[collection_name].drop() und hatte die gleichen Probleme, die Sie mit dem db.dropDatabase() Methode. Das Umschalten der s/drop/remove/ hat hervorragend funktioniert!

15 Stimmen

Ich habe festgestellt, dass remove() funktioniert nicht gut mit MongoDB für Windows, und stattdessen musste ich Folgendes tun remove({}) das sowohl unter OSX als auch unter Windows funktioniert.

1 Stimmen

Vielen Dank für den Hinweis, wir arbeiten mit einer Linux-Plattform, aber es lohnt sich, die Sache etwas genauer zu untersuchen.

40voto

db.getCollectionNames().forEach(c=>db[c].drop())

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X