2012-10-11 22 views
8

Dokonałem restrukturyzacji bazy danych i nie potrzebuję już niektórych kolekcji. Jednak jest ich zbyt wiele, by usunąć je ręcznie (w rzeczywistości tysiące). Każda z tych kolekcji zaczyna się od "cache_" i zawiera kilka indeksów, które chciałbym upewnić się, że są całkowicie wyczyszczone.MongoDB: Usuwanie wszystkich kolekcji, których nazwa pasuje do ciągu znaków

Próbuję zrozumieć, jak używać powłoki Mongo, aby zapętlić wszystkie nazwy kolekcji i usunąć te kolekcje, które zaczynają się od "cache_". Zgodnie z Queries & Cursors documentation, rozumiem, jak pętli nad dokumentami w kolekcji, ale nie sposób korzystać z powłoki MongoDB do przechodzenia przez kolekcje w bazie danych.

W pseudo-kodu, to jest to, czego potrzebuję:

var all_collections = show collections 
for(var collection in all_collections) 
    if(collection.name.indexOf('cache_')==0) 
     collection.drop() 

FWIW, zrobiłem poszukiwanie "pętli MongoDB opisów Collection" itd. I nie znalazłem niczego, ale może w sux teh googlez = P

Na pokrewnej notatce ... po wykonaniu tego stopnia restrukturyzacji, czy powinienem robić db.repairDatabase() lub coś w tym rodzaju, aby upewnić się, że zrzucone indeksy itp. są ładne i czyste?

Dzięki. Aby uzyskać wszystkie kolekcje i zapisać je w tablicy, należy użyć

Odpowiedz

20

.

var collectionNames = db.getCollectionNames(); 
for(var i = 0, len = collectionNames.length; i < len ; i++){ 
    var collectionName = collectionNames[i]; 
    if(collectionName.indexOf('cache_') == 0){ 
     db[collectionName].drop() 
    } 
} 
+1

FTW, dzięki. Chyba nie wiedziałem, że "show collections" => "db.getCollectionNames();" –

+0

** db [nazwa_kolekcji] ** jest tutaj kluczem. _Javascript wykonać na RoboMongo_ 'zbiory var = [ 'collection1', 'collection2'] collections.forEach (funkcja (coll_name) { druku (coll_name) dB [coll_name] .drop() })' – Abhijeet

1

Wystarczy dodać kolejną odpowiedź znaleźć on mongodb mailing list

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

Prawdopodobnie nie chcą spadać lokalnych DBS/config/admin jak już wymienione powyżej.

+0

I zrobił: 'use toto', a następnie' db.getSiblingDB ("mydb"). dropDatabase(); 'thx – Maxence

0

Następujące działa dobrze dla mnie, aby usunąć kolekcje utworzone przez mapę zmniejszyć zadania. W moim przypadku zostały one automatycznie usunięte na lokalnej instalacji, ale z jakiegokolwiek powodu utknęły na serwerze.

db.getCollectionNames().forEach(function (d) { 
    if (d != "collectionICareAbout" && d != "system.indexes" && d != "system.users") { 
     print("dropping: " + d); 
     db[d].drop(); 
    } 
}) 

ta jest podobna do odpowiedzi Nishant, ale różnica jest taka, że ​​nie masz uprawnień administratora i nie można powoływać się db.adminCommand (gospodarzem instancji Mongo).

Powiązane problemy