Eliminar todo en una base de datos MongoDB

454

Estoy haciendo desarrollo en MongoDB. Para propósitos totalmente no malvados, a veces quiero eliminar todo lo que hay en una base de datos, es decir, eliminar cada colección, y cualquier otra cosa que pueda estar por ahí, y comenzar desde cero. ¿Hay una sola línea de código que me permita hacer esto? Puntos de bonificación por dar un método de consola MongoDB y un método de controlador MongoDB Ruby.

Trevor Burnham
fuente

Respuestas:

588

En la concha de mongo:

use [database];
db.dropDatabase();

Y para eliminar a los usuarios:

db.dropAllUsers();
Josh K
fuente
23
@connorbode Gracias por esto. Sin embargo, lo leí y de inmediato: "¡B-Pero OP no quiere eliminar la base de datos!" . Comando muy engañoso !!
Henrique Miranda
Úselo con precaución: si se encuentra en un entorno fragmentado con wiredTiger y no tiene una base de datos de usuario e invoca dropDatabase, la base de datos se eliminará y podría volver a aparecer como primaria en un fragmento diferente cuando se agreguen nuevos registros.
Jason R. Coombs
2
Esto no eliminará el usuario que está conectado a la base de datos relacionada. Por lo tanto, es posible que desee eliminarlo manualmente. db.dropAllUsers();
Fırat KÜÇÜK
2
Tenga en cuenta que la base de datos no se mostrará después de usar el comando "use dbs". Sin embargo, está ahí. Entonces, no te preocupes.
wynshaft
@StepanYakovenko Probablemente necesite autenticarse con la instancia de MongoDB
Josh K
114

Además, desde la línea de comando:

mongo DATABASE_NAME --eval "db.dropDatabase();"
Rimian
fuente
55
No creo que esto funcione en 2.4.6. Mis registros aún existen.
Brandon Clark
¿Esto también alejará a los usuarios de la base de datos?
Gert van den Berg
67

Tuve el mismo problema, cuando necesitaba restablecer todas las colecciones pero no quería perder ningún usuario de la base de datos. Utilice la siguiente línea de código, si desea guardar la configuración del usuario para la base de datos:

use <whichever database>
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db[c].drop(); })

Este código pasará por todos los nombres de colección de una base de datos y descartará aquellos que no comiencen con "sistema".

Gering
fuente
2
Según lo mencionado por @DanH, puede ser más confiable usarlo removeen lugar de drop. La removeopción parece mantener restricciones en los campos de las colecciones que está borrando. Cuando empleamos el dropmétodo, la uniquerestricción en uno de nuestros campos no se cumplió después de la caída.
Scottymac
@Scottymac: mejor aún, agregue una elserama (a la if (c.indexOf("system.") == -1)) que lo haga en removelugar de drop. De esa manera, no te quedarán colecciones vacías si ya no las estás usando
Bogdan D
1
Mejor que db[c], use db.getCollection(c)que evita errores cuando los nombres de las colecciones son dígitos .
Jason R. Coombs
1
Según los documentos , desde MongoDB 2.6, un comando dropDatabase no eliminará usuarios, por lo que probablemente sea preferible la respuesta aceptada.
Jason R. Coombs
1
Si el nombre de la colección es numérico, esto debería funcionar en su lugar:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu
35

Seguí la db.dropDatabase()ruta durante mucho tiempo, sin embargo, si está tratando de usar esto para borrar la base de datos entre casos de prueba, eventualmente puede encontrar problemas con las restricciones de índice que no se cumplen después de la caída de la base de datos. Como resultado, tendrá que meterse con sureIndexes, o una ruta más simple sería evitar la dropDatabase por completo y simplemente eliminar de cada colección en un bucle como:

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

En mi caso, estaba ejecutando esto desde la línea de comandos usando:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"
DanH
fuente
1
Gracias por esta sugerencia, la estábamos usando db[collection_name].drop()y exhibía los mismos problemas que describió con el db.dropDatabase()método. ¡Cambiando el s/drop/remove/trabajo brillantemente!
Scottymac
10
Descubrí que eso remove()no funciona bien en MongoDB para Windows, y en su lugar necesitaba hacer lo remove({})que funciona tanto en OSX como en Windows.
DanH
Gracias por el consejo, estamos en una plataforma Linux, pero vale la pena investigar un poco más.
Scottymac
2
¡Noté un error para la eliminación, ya que db [nombre_colección] .remove () no tiene una consulta! Por lo tanto, debe ser: db [nombre_colección] .remove ({})
JoelParke
16

Al compilar respuestas de @Robse y @DanH (¡felicitaciones!), Tengo la siguiente solución que me satisface por completo:

db.getCollectionNames().forEach( function(collection_name) { 
  if (collection_name.indexOf("system.") == -1) 
       db[collection_name].drop();
  else  
       db.collection_name.remove({}); 
});

Conéctese a su base de datos, ejecute el código.

Limpia la base de datos eliminando las colecciones de usuarios y vaciando las colecciones del sistema.

Bogdan D
fuente
Este script limpia todo dentro de una sola base de datos Mongo en particular. Borra todas las colecciones en esta base de datos.
staskrak
10

Escuche algunos usan operaciones de eliminación completa para mongodb usando mongo shell

Para eliminar un documento particular en colecciones: db.mycollection.remove( {name:"stack"} )

Para eliminar todos los documentos en colecciones: db.mycollection.remove()

Para eliminar la colección: db.mycollection.drop()

para eliminar la base de datos: primero vaya a esa base de datos por use mydbcomando y luego

db.dropDatabase()
bhv
fuente
8

Utilizar

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();
Mohamed El Gamal
fuente
7

en caso de que necesite soltar todo de una vez: (suelte todas las bases de datos a la vez)

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
sjas
fuente
7
db.getCollectionNames().forEach(c=>db[c].drop())
Selvakumar Ponnusamy
fuente
5

si desea eliminar solo una base de datos y sus subcolecciones, use esto:

  • use <database name>;
  • db.dropDatabase();

si desea eliminar todas las bases de datos en mongo, use esto:

db.adminCommand("listDatabases").databases.forEach(function(d)
             {
              if(d.name!="admin" && d.name!="local" && d.name!="config")
                {
                 db.getSiblingDB(d.name).dropDatabase();
                }
             }
          );
Stéphane Bruckert
fuente
Gran respuesta ... esto es probablemente lo que el usuario estaba llegando
robert
1

La forma más simple de eliminar una base de datos dice blog:

> use blog
switched to db blog
> db.dropDatabase();
{ "dropped" : "blog", "ok" : 1 }
Shalabh Raizada
fuente
1

Para desarrolladores de Meteor.

  1. Abra una segunda ventana de terminal mientras ejecuta su aplicación localhost:3000.

  2. En la carpeta de su proyecto, ejecute meteor mongo.

    coolName = new Mongo.Collection('yourCollectionName');

  3. Luego simplemente ingrese db.yourCollectionName.drop();

  4. Verá automáticamente los cambios en su servidor local.

Para todos los demás.

db.yourCollectionName.drop();

Felipe Alarcon
fuente
1
  1. Listar todos los dbs disponibles mostrar dbs
  2. Elija el uso de db necesario
  3. Descarte la base de datos db.dropDatabase () // Pocos comandos adicionales
  4. Listar todas las colecciones disponibles en una colección de show de db
  5. Eliminar una colección de especificaciones db.collection.drop ()

Espero que ayude

priya raj
fuente
1

yo prefiero

db.your_collection.remove({})

terminado

db.your_collection.drop()

Si su colección era una colección especial, es decir, una colección con límite o una colección con un campo marcado como único, al soltar se borrará la colección en sí y cuando la colección se vuelva a crear, será una colección normal. Tendrá que definir las propiedades nuevamente. Por lo tanto, use remove()para borrar los documentos sin eliminar la colección y afectar el comportamiento de la colección.

Sreeragh AR
fuente
1
Buenos puntos. Sin embargo, vale la pena mencionar que drop()es casi instantáneo y remove({})bloquea su base de datos durante minutos o decenas de minutos (dependiendo del tamaño de la colección).
Sergio Tulentsev
0

Para eliminar todos los DBs use:

for i in $(mongo --quiet --host $HOSTNAME --eval "db.getMongo().getDBNames()" | tr "," " ");

do mongo $i --host $HOSTNAME --eval "db.dropDatabase()";

done 
Zaur
fuente
0
use <dbname>
db.dropAllUsers()
db.dropAllRoles()
db.dropDatabase()

Documentación de MongoDB db.dropDatabase () que explica la modificación introducida en 2.6:

Modificado en la versión 2.6: este comando no elimina los usuarios asociados con la base de datos actual.

Antonio Bardazzi
fuente
0

En MongoDB 3.2 y posteriores, Mongo().getDBNames()en el mongoshell se mostrará una lista de nombres de bases de datos en el servidor:

> Mongo().getDBNames()
[ "local", "test", "test2", "test3" ]

> show dbs
local  0.000GB
test   0.000GB
test2  0.000GB
test3  0.000GB

Un forEach()bucle sobre la matriz podría llamar dropDatabase()para descartar todas las bases de datos enumeradas. Opcionalmente, puede optar por omitir algunas bases de datos importantes que no desea eliminar. Por ejemplo:

Mongo().getDBNames().forEach(function(x) {
  // Loop through all database names
  if (['admin', 'config', 'local'].indexOf(x) < 0) {
    // Drop if database is not admin, config, or local
    Mongo().getDB(x).dropDatabase();
  }
})

Ejemplo de ejecución:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
test2   0.000GB
test3   0.000GB

> Mongo().getDBNames().forEach(function(x) {
...   if (['admin', 'config', 'local'].indexOf(x) < 0) {
...     Mongo().getDB(x).dropDatabase();
...   }
... })

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
kevinadi
fuente