2013-05-11 14 views
40

Jak skasować kolekcję w MongoDB lub czy jest coś takiego?Skróć kolekcję

W tej chwili muszę usunąć 6 dużych kolekcji naraz i zatrzymuję serwer, usuwając pliki bazy danych, a następnie odtwarzając bazę danych i kolekcje w niej zawarte. Czy istnieje sposób na usunięcie danych i pozostawienie kolekcji w obecnej postaci? Operacja usuwania zajmuje bardzo dużo czasu. Mam miliony wpisów w zbiorach.

+0

Jak wykonuje się operację usuwania (gdy zajmuje to bardzo dużo czasu)? – Stennie

+7

db.collection.remove ({}); – iefpw

+3

Ah! Polecenie 'remove()' będzie ** znacznie ** wolniejsze niż 'drop()' dla dużej kolekcji, ponieważ wykonuje dodatkowe operacje aktualizowania indeksów, ponieważ dokumenty są usuwane. Jeśli usuwasz wszystkie dokumenty z kolekcji, najlepszym sposobem jest "drop()". Ograniczeniem w upuszczaniu i odtwarzaniu tej samej kolekcji jest to, że trzeba będzie ponownie zapewnić indeksy dodatkowe. – Stennie

Odpowiedz

30

Możesz skutecznie usunąć wszystkie dane i indeksy dla kolekcji z db.collection.drop(). Upuszczenie kolekcji z dużą liczbą dokumentów i/lub indeksów będzie znacznie bardziej wydajne niż usuwanie wszystkich dokumentów przy użyciu db.collection.remove({}). Metoda remove() powoduje dodatkowe porządkowanie indeksów aktualizujących, ponieważ dokumenty są usuwane, a nawet wolniej w środowisku zestawu replik, w którym oplog zawierałby wpisy dla każdego usuniętego dokumentu, a nie pojedyncze polecenie usuwania.

przykład stosując mongo powłoki:

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

Warto zauważyć, że wyrzuca kolekcja różnych wyników dotyczących wykorzystywania pamięci, w zależności od konfiguracji silnika składowania:

  • WiredTiger (domyślnie kątem przechowywania w MongoDB 3.2 lub nowszy) zwolni miejsce używane przez upuszczoną kolekcję (i wszelkie powiązane indeksy) po zakończeniu upuszczania.
  • MMAPv1 (domyślny silnik pamięci w MongoDB 3.0 i starszych) będzie nie zwolnić preallocated disk space. Może to być dobre dla twojego przypadku użycia; wolna przestrzeń jest dostępna do ponownego wykorzystania po włożeniu nowych danych.

Jeśli zamiast upuszczania bazy danych zazwyczaj nie trzeba jawnie tworzyć kolekcji, ponieważ zostaną utworzone po włożeniu dokumentów.

Jednak tutaj jest przykładem usuwania i ponownego tworzenia bazy danych o tej samej nazwie zbiór w mongo powłoki:

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); 
}) 
+1

Zapomniałem zauważyć, że po upuszczeniu i ponownym utworzeniu kolekcji konieczne będzie dodanie dodatkowych indeksów. Możesz wyświetlić istniejące definicje indeksów za pomocą 'db.system.indexes.find()'. – Stennie

+0

Czy nie spowoduje to spustoszenia, gdy zostanie wykonany w kolekcji podzielonej na partycje/sharded? – zamnuts

+0

@zamnuts Dzięki za komentowanie! Pojawił się kolejny problem z upuszczaniem i ponownym użyciem przestrzeni nazw w zbitym klastrze: [SERVER-17397 - upuszczenie bazy danych lub kolekcji w Sharded Cluster może nie zakończyć się całkowicie] (https://jira.mongodb.org/browse/SERVER- 17397). Zostało to zgłoszone na MongoDB 2.6+ (niepotwierdzone, jeśli wcześniejsze wersje mają ten sam problem). Istnieje obejście tego problemu, które zawiera dodatkowe kroki, aby zapewnić zaktualizowanie serwera konfiguracji i wyczyszczenie pamięci podręcznej 'mongos' przed odtworzeniem przestrzeni nazw. – Stennie

2

Tworzenie bazy danych i zbiorów, a następnie kopii zapasowej bazy danych, aby bson plików za pomocą mongodump:

mongodump --db database-to-use 

Wtedy, gdy trzeba usunąć bazę danych i odtworzenie poprzedniego środowiska, wystarczy użyć mongorestore:

mongorestore --drop 

Kopia zapasowa zostanie zapisana w bieżącym katalogu roboczym, w folderze o nazwie dump, przy użyciu polecenia mongodump.

+0

spowoduje to usunięcie wszystkich elementów, w tym indeksów. – astroanu

50

obciąć do zbierania i utrzymywania indeksy użyciu

db.<collection>.remove({}) 
+0

Działa to, ale rozmiary indeksu pozostają takie same. Czy istnieje sposób, aby również skrócić indeksy, ale mimo to zachować je? – logic

+0

zauważyć, jednak tha remove() jest znacznie wolniejszy niż drop(). – rlib

+0

@rlib tak powinno być :) – astroanu

7

z poniższa kwerenda usunie wszystkie rekordy w kolekcjach i pozostawi kolekcję taką, jaka jest,

db.collectionname.remove({}) 
1

Nie ma odpowiednika operacji "skracania" w MongoDB.Możesz albo usunąć wszystkie dokumenty, ale będzie mieć złożoność O (n), albo upuścić kolekcję, wtedy złożoność będzie O (1), ale stracisz indeksy.