Elimina tutto in un database MongoDB


454

Sto facendo lo sviluppo su MongoDB. Per scopi totalmente non malvagi, a volte voglio spazzare via tutto in un database, vale a dire eliminare ogni singola raccolta, e qualsiasi altra cosa possa essere in giro, e ricominciare da zero. C'è una sola riga di codice che mi permetterà di farlo? Punti bonus per dare sia un metodo console MongoDB che un metodo driver MongoDB Ruby.

Risposte:


588

Nel guscio di mongo:

use [database];
db.dropDatabase();

E per rimuovere gli utenti:

db.dropAllUsers();

23
@connorbode Grazie per questo. L'ho letto e subito però: "B-Ma OP non vuole rimuovere il database!" . Comando molto fuorviante !!
Henrique Miranda,

Usare con cautela: se ci si trova in un ambiente frammentato usando wiredTiger e non si dispone di un database utente e si richiama dropDatabase, il database verrà eliminato e potrebbe apparire di nuovo su un frammento diverso quando vengono aggiunti nuovi record.
Jason R. Coombs il

2
Ciò non eliminerà l'utente collegato al database correlato. Quindi potresti volerlo eliminare manualmente. db.dropAllUsers();
Fırat KÜÇÜK l'

2
Si noti che il database non verrà visualizzato dopo aver utilizzato il comando "usa dbs". Tuttavia, è lì. Quindi, nessuna preoccupazione.
wynshaft

@StepanYakovenko Probabilmente dovrai autenticarti con l'istanza MongoDB
Josh K

114

Inoltre, dalla riga di comando:

mongo DATABASE_NAME --eval "db.dropDatabase();"

5
Non credo che questo funzioni in 2.4.6. I miei record esistono ancora.
Brandon Clark,

Questo consentirà anche agli utenti remoti di accedere al database?
Gert van den Berg,

67

Ho avuto lo stesso problema, quando avevo bisogno di ripristinare tutte le raccolte ma non volevo perdere alcun utente del database. Utilizzare la seguente riga di codice, se si desidera salvare la configurazione utente per il database:

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

Questo codice passerà attraverso tutti i nomi delle raccolte da un database e eliminerà quelli che non iniziano con "sistema".


2
Come menzionato da @DanH, potresti trovarlo più affidabile da usare removeal posto di drop. L' removeopzione sembra mantenere vincoli sui campi delle raccolte che si stanno cancellando. Quando abbiamo utilizzato il dropmetodo, il uniquevincolo su uno dei nostri campi non è stato rispettato a seguito del calo.
Scottymac,

@Scottymac - ancora meglio, aggiungi un elseramo (al if (c.indexOf("system.") == -1)) che fa removeinvece di drop. In questo modo non rimarrai con raccolte vuote se non le utilizzi più
Bogdan D

1
Meglio di db[c], utilizzare db.getCollection(c)che evita errori quando i nomi delle raccolte sono cifre .
Jason R. Coombs,

1
Secondo i documenti , dal MongoDB 2.6, un comando dropDatabase non eliminerà gli utenti, quindi la risposta accettata è probabilmente preferibile.
Jason R. Coombs,

1
Se il nome della raccolta è numerico, dovrebbe funzionare invece:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu

35

Ho seguito il db.dropDatabase()percorso per molto tempo, tuttavia se si sta tentando di utilizzarlo per cancellare il database tra i casi di test, è possibile che alla fine si verifichino problemi con vincoli di indice non rispettati dopo la caduta del database. Di conseguenza, dovrai fare un pasticcio con sureIndex o un percorso più semplice eviterà il dropDatabase nel suo complesso e rimuoverà da ogni raccolta in un ciclo come:

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

Nel mio caso lo stavo eseguendo dalla riga di comando usando:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"

1
Grazie per questo suggerimento, stavamo usando db[collection_name].drop()e mostrava gli stessi problemi che hai descritto con il db.dropDatabase()metodo. Il passaggio ha s/drop/remove/funzionato alla grande!
Scottymac,

10
Ho scoperto che remove()non funziona bene su MongoDB per Windows, e invece dovevo fare ciò remove({})che funziona sia su OSX che su Windows.
DanH

Grazie per il suggerimento, siamo su una piattaforma Linux, ma vale la pena approfondire ulteriormente.
Scottymac,

2
Ho notato un errore per l'eliminazione, poiché db [nome_raccolta] .remove () non ha una query! Quindi in realtà deve essere: db [nome_raccolta] .remove ({})
JoelParke,

16

Compilando le risposte di @Robse e @DanH (kudos!), Ho la seguente soluzione che mi soddisfa completamente:

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

Connettiti al tuo database, esegui il codice.

Pulisce il database eliminando le raccolte utenti e svuotando le raccolte di sistema.


Questo script pulisce tutto in un solo database Mongo particolare. Cancella tutte le raccolte in questo database.
staskrak,

10

Ascolta alcuni usano operazioni di eliminazione completa per mongodb usando la shell mongo

Per eliminare un particolare documento nelle raccolte: db.mycollection.remove( {name:"stack"} )

Per eliminare tutti i documenti nelle raccolte: db.mycollection.remove()

Per eliminare la raccolta: db.mycollection.drop()

per cancellare il database: prima vai su quel database tramite use mydbcomando e poi

db.dropDatabase()

8

Uso

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();

7

nel caso in cui dovessi eliminare tutto in una volta: (elimina tutti i database contemporaneamente)

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'


5

se si desidera eliminare solo un database e le sue raccolte secondarie, utilizzare questo:

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

se si desidera eliminare tutti i database in mongo, utilizzare questo:

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

Ottima risposta ... questo è probabilmente ciò che l'utente stava ottenendo
robert

1

Il modo più semplice per eliminare un database dice blog:

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

1

Per gli sviluppatori Meteor.

  1. Apri una seconda finestra del terminale mentre esegui l'app localhost:3000.

  2. In corsa la cartella del progetto, meteor mongo.

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

  3. Quindi inserisci semplicemente db.yourCollectionName.drop();

  4. Vedrai automaticamente le modifiche nel tuo server locale.

Per tutti gli altri.

db.yourCollectionName.drop();


1
  1. Elenca tutti i dbs disponibili mostra dbs
  2. Scegli l'uso db necessario
  3. Eliminare il database db.dropDatabase () // Pochi comandi aggiuntivi
  4. Elencare tutte le raccolte disponibili in raccolte di spettacoli db
  5. Rimuovere una raccolta di specifiche db.collection.drop ()

spero che aiuti


1

preferisco

db.your_collection.remove({})

al di sopra di

db.your_collection.drop()

Se la tua collezione era una collezione speciale, ovvero una collezione con cappuccio o una collezione con un campo contrassegnato come univoco, il rilascio eliminerà la collezione stessa e quando la collezione verrà nuovamente creata sarà una collezione ordinaria. Dovrai definire nuovamente le proprietà. Quindi utilizzare remove()per cancellare i documenti senza rimuovere la raccolta e influire sul comportamento della raccolta.


1
Punti buoni. Vale la pena ricordare, tuttavia, che drop()è quasi istantaneo e remove({})blocca il tuo db per minuti o decine di minuti (a seconda delle dimensioni della raccolta).
Sergio Tulentsev,

0

Per eliminare tutti i DB utilizzare:

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

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

done 


0

In MongoDB 3.2 e versioni successive, Mongo().getDBNames()nella mongoshell verrà visualizzato un elenco di nomi di database nel server:

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

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

Un forEach()loop sull'array potrebbe quindi chiamare dropDatabase()per eliminare tutti i database elencati. Facoltativamente, puoi scegliere di saltare alcuni database importanti che non desideri eliminare. Per esempio:

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

Esempio di esecuzione:

> 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.