2012-10-11 25 views
8

He reestructurado un poco mi base de datos y ya no necesito colecciones. Sin embargo, hay demasiados para eliminarlos a mano (miles, en realidad). Cada una de las colecciones en cuestión comienza con "cache_" y contiene un par de índices que me gustaría asegurar que estén completamente limpios.MongoDB: Eliminar todas las colecciones cuyo nombre coincida con una cadena

Estoy tratando de entender cómo usar el shell mongo para recorrer todos los nombres de colección y eliminar aquellas colecciones que comienzan con "cache_". Por el Queries & Cursors documentation, entiendo cómo recorrer los documentos dentro de una colección, pero no cómo usar el shell MongoDB para recorrer las colecciones en la base de datos.

En pseudo-código, esto es lo que necesito:

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

Fwiw, he hecho la búsqueda de "bucle mongodb través de nombres de colección", etc., y no he encontrado nada, pero tal vez sux at teh googlez = P

En una nota relacionada ... después de hacer este grado de reestructuración, ¿debería estar haciendo un db.repairDatabase() o algo por el estilo para asegurarme de que los índices caídos, etc., estén todos bien y limpios?

Gracias.

Respuesta

20

Usa db.getCollectionNames() para obtener todas las colecciones y guárdalas en una matriz.

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, gracias. Supongo que no sabía que "mostrar colecciones" => "db.getCollectionNames();" –

+0

** db [collectionName] ** es la clave aquí. _Javascript para ejecutar en RoboMongo_ 'colecciones var = [ 'collection1', 'collection2'] collections.forEach (function (coll_name) { de impresión (coll_name) db [coll_name] .drop() })' – Abhijeet

1

Sólo para añadir otra respuesta encuentran 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(); 
}) 

Es posible que desee dejar caer los dbs/config/administrador local como los que hemos mencionado.

+0

I did: 'use toto' y luego' db.getSiblingDB ("mydb"). dropDatabase(); 'thx – Maxence

0

Lo siguiente funcionó muy bien para mí para eliminar las colecciones creadas por los trabajos de reducción de mapa. En mi caso, se eliminaron automáticamente en la configuración local, pero por alguna razón se quedaron en el servidor.

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

Esto es similar a la respuesta de Nishant, pero la diferencia es que no tiene derechos de administrador y no puede invocar db.adminCommand (alojado ejemplo mongo).

Cuestiones relacionadas