it-swarm.com.de

Eine Sammlung abschneiden

Wie schneide ich eine Sammlung in MongoDB ab oder gibt es so etwas?

Im Moment muss ich 6 große Sammlungen auf einmal löschen. Ich stoppe den Server, lösche die Datenbankdateien und stelle die Datenbank und die darin enthaltenen Sammlungen wieder her. Gibt es eine Möglichkeit, die Daten zu löschen und die Sammlung so zu belassen, wie sie ist? Der Löschvorgang dauert sehr lange. Ich habe Millionen von Einträgen in den Sammlungen.

47
iefpw

Mit db.collection.drop() können Sie alle Daten und Indizes für eine Sammlung effizient löschen. Das Löschen einer Sammlung mit einer großen Anzahl von Dokumenten und/oder Indizes ist erheblich effizienter als das Löschen aller Dokumente mit db.collection.remove({}). Die remove()-Methode übernimmt das zusätzliche Housekeeping der Aktualisierung von Indizes, wenn Dokumente gelöscht werden, und wäre in einer Replikatgruppenumgebung, in der das Oplog Einträge für jedes entfernte Dokument enthalten würde, noch langsamer als ein einzelner Befehl zum Aufheben der Sammlung.

Beispiel mit der mongo Shell:

var dbName = 'nukeme';
db.getSiblingDB(dbName).getCollectionNames().forEach(function(collName) {
    // Drop all collections except system ones (indexes/profile)
    if (!collName.startsWith("system.")) {
        // Safety hat
        print("WARNING: going to drop ["+dbName+"."+collName+"] in 5s .. hit Ctrl-C if you've changed your mind!");
        sleep(5000);
        db[collName].drop();
    }
})

Beachten Sie, dass das Löschen einer Sammlung je nach konfigurierter Speicher-Engine unterschiedliche Ergebnisse bei der Speichernutzung ergibt:

  • WiredTiger (Standardspeicher-Engine in MongoDB 3.2 oder neuer) gibt den Speicherplatz frei, der von einer gelöschten Sammlung (und allen zugehörigen Indizes) belegt wird, sobald der Löschvorgang abgeschlossen ist.
  • MMAPv1 (Standardspeicher-Engine in MongoDB 3.0 und älter) wird not _ ​​ vorab zugewiesenen Speicherplatz freigeben. Dies kann für Ihren Anwendungsfall in Ordnung sein. Der freie Speicherplatz steht zur Wiederverwendung zur Verfügung, wenn neue Daten eingefügt werden.

Wenn Sie stattdessen die Datenbank löschen, müssen Sie die Sammlungen normalerweise nicht explizit erstellen, da sie beim Einfügen von Dokumenten erstellt werden.

Es folgt jedoch ein Beispiel für das Löschen und Wiederherstellen der Datenbank mit denselben Namen in der mongo-Shell:

var dbName = 'nukeme';

// Save the old collection names before dropping the DB
var oldNames = db.getSiblingDB(dbName).getCollectionNames();

// Safety hat
print("WARNING: going to drop ["+dbName+"] in 5s .. hit Ctrl-C if you've changed your mind!")
sleep(5000)

db.getSiblingDB(dbName).dropDatabase();

// Recreate database with the same collection names
oldNames.forEach(function(collName) {
    db.getSiblingDB(dbName).createCollection(collName);
})
33
Stennie

Um eine Sammlung abzuschneiden und die verwendeten Indizes beizubehalten

 db.<collection>.remove({})
55
astroanu

die nachstehende Abfrage löscht alle Datensätze in einer Sammlung und behält die Sammlung wie sie ist.

db.collectionname.remove({})
7
IAmHomes

Es gibt kein Äquivalent zum "Abschneiden" von MongoDB. Sie können entweder alle Dokumente entfernen, aber es wird eine Komplexität von O (n) haben oder die Sammlung löschen. Die Komplexität wird dann O(1) sein, aber Sie verlieren Ihre Indizes.

2
Alon

Erstellen Sie die Datenbank und die Sammlungen und sichern Sie die Datenbank mit mongodump in bson-Dateien:

mongodump --db database-to-use

Wenn Sie die Datenbank löschen und die vorherige Umgebung neu erstellen müssen, verwenden Sie einfach mongorestore:

mongorestore --drop

Die Sicherung wird im aktuellen Arbeitsverzeichnis in einem Ordner namens dump gespeichert, wenn Sie den Befehl mongodump verwenden.

2
vinipsmaker

Die db.drop()-Methode erhält eine Schreibsperre für die betroffene Datenbank und blockiert andere Vorgänge, bis sie abgeschlossen ist.

Ich denke, dass die db.remove({}) Methode besser ist als db.drop().

0
Congwu Zhang

(nur Info)

Wenn Sie dies in Laravel tun müssen, können wir dies verwenden

ModelName::truncate();

Wir können auch den Mongo Compass (GUI für Mongo) verwenden, ein exzellentes Werkzeug, das wir für diese Art von Operationen leicht verstehen können

0
anil