Excluir tudo em um banco de dados MongoDB

454

Estou desenvolvendo o MongoDB. Para propósitos totalmente não-maus, às vezes eu quero explodir tudo em um banco de dados - ou seja, excluir todas as coleções e qualquer outra coisa que esteja por aí e começar do zero. Existe uma única linha de código que me permita fazer isso? Pontos de bônus por fornecer um método de console do MongoDB e um método de driver do MongoDB Ruby.

Trevor Burnham
fonte

Respostas:

588

Na casca do mongo:

use [database];
db.dropDatabase();

E para remover os usuários:

db.dropAllUsers();
Josh K
fonte
23
@connorbode Obrigado por isso. Eu li e imediatamente, porém: "B-mas OP não quer remover o banco de dados!" . Comando muito enganador !!
Henrique Miranda
Use com cuidado: se você estiver em um ambiente fragmentado usando o wiredTiger e não tiver um banco de dados do usuário e invocar o dropDatabase, o banco de dados será excluído e poderá reaparecer como primário em um fragmento diferente quando novos registros forem adicionados.
Jason R. Coombs
2
Isso não excluirá o usuário conectado ao banco de dados relacionado. Portanto, você pode excluí-lo manualmente. db.dropAllUsers();
Fırat KÜÇÜK
2
Observe que o banco de dados não será exibido depois de usar o comando "use dbs". No entanto, está lá. Então, não se preocupe.
Wynshaft
@StepanYakovenko Provavelmente precisa se autenticar com a instância MongoDB
Josh K
114

Além disso, na linha de comando:

mongo DATABASE_NAME --eval "db.dropDatabase();"
Rimian
fonte
5
Não acredito que isso funcione no 2.4.6. Meus registros ainda existem.
Brandon Clark
Isso também remota os usuários no banco de dados?
Gert van den Berg
67

Eu tive o mesmo problema, quando precisava redefinir todas as coleções, mas não queria perder nenhum usuário do banco de dados. Use a seguinte linha de código, se desejar salvar a configuração do usuário para o banco de dados:

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

Esse código passará por todos os nomes de coleção de um banco de dados e eliminará aqueles que não começam com "sistema".

Gering
fonte
2
Conforme mencionado por @DanH, você pode achar mais confiável usá-lo removeno lugar de drop. A removeopção parece manter restrições nos campos das coleções que você está limpando. Quando empregamos o dropmétodo, a uniquerestrição em um de nossos campos não foi respeitada após a queda.
precisa saber é o seguinte
@ Scottymac - melhor ainda, adicione um elseramo (ao if (c.indexOf("system.") == -1)) que sim, em removevez de drop. Dessa forma, você não ficará com as coleções vazias se não as estiver mais usando
Bogdan D
1
Melhor que db[c], use o db.getCollection(c)que evita erros quando os nomes de coleções são dígitos .
Jason R. Coombs
1
De acordo com os documentos , desde o MongoDB 2.6, um comando dropDatabase não exclui usuários, portanto a resposta aceita é provavelmente preferível.
Jason R. Coombs
1
Se o nome da coleção for numérico, isso funcionará:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu
35

Eu segui a db.dropDatabase()rota por um longo tempo, no entanto, se você estiver tentando usá-la para limpar o banco de dados entre os casos de teste, poderá encontrar problemas com restrições de índice que não são respeitadas após a queda do banco de dados. Como resultado, você precisará mexer com o garantirIndexes, ou uma rota mais simples seria evitar o dropDatabase completamente e apenas remover de cada coleção em um loop, como:

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

No meu caso, eu estava executando isso na linha de comando usando:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"
DanH
fonte
1
Obrigado por esta sugestão, estávamos usando db[collection_name].drop()e exibia os mesmos problemas que você descreveu com o db.dropDatabase()método. Mudando o s/drop/remove/trabalhou brilhantemente!
precisa saber é o seguinte
10
Descobri que remove()isso não funciona bem no MongoDB para Windows e, em vez disso, eu precisava fazer o remove({})que funciona no OSX e no Windows.
DANH
Obrigado pela dica, estamos em uma plataforma Linux, mas vale a pena procurar um pouco mais.
precisa saber é o seguinte
2
Percebi um erro para a exclusão - já que db [collection_name] .remove () não possui uma consulta! Então, ele realmente precisa ser: db [collection_name] .remove ({})
JoelParke
16

Compilando respostas de @Robse e @DanH (parabéns!), Obtive a seguinte solução que me satisfaz completamente:

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

Conecte-se ao seu banco de dados, execute o código.

Ele limpa o banco de dados descartando as coleções de usuários e esvaziando as coleções do sistema.

Bogdan D
fonte
Esse script limpa tudo dentro de apenas um banco de dados Mongo específico. Apaga todas as coleções neste banco de dados.
staskrak
10

Ouvir algumas operações de exclusão completa de uso do mongodb usando o mongo shell

Para excluir um documento específico nas coleções: db.mycollection.remove( {name:"stack"} )

Para excluir todos os documentos nas coleções: db.mycollection.remove()

Para excluir a coleção: db.mycollection.drop()

para excluir o banco de dados: primeiro vá para esse banco de dados por use mydbcomando e, em seguida,

db.dropDatabase()
bhv
fonte
8

Usar

[databaseName]
db.Drop+databaseName();

drop collection 

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

caso você precise descartar tudo de uma vez: (descartar todos os bancos de dados de uma só vez)

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

se você deseja excluir apenas um banco de dados e suas sub-coleções, use este:

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

se você deseja excluir todos os bancos de dados no mongo, use este:

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
fonte
Ótima resposta ... provavelmente é isso que o usuário estava recebendo #
robert
1

A maneira mais simples de excluir um banco de dados, digamos, blog:

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

Para desenvolvedores de Meteor.

  1. Abra uma segunda janela do terminal enquanto executa o aplicativo localhost:3000.

  2. Na pasta do seu projeto, execute meteor mongo,.

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

  3. Em seguida, basta digitar db.yourCollectionName.drop();

  4. Você verá automaticamente as alterações no seu servidor local.

Para todo mundo.

db.yourCollectionName.drop();

Felipe Alarcon
fonte
1
  1. Listar todos os dbs disponíveis show dbs
  2. Escolha o uso de db necessário
  3. Solte o banco de dados db.dropDatabase () // Alguns comandos adicionais
  4. Listar todas as coleções disponíveis em uma coleção de db show
  5. Remova uma coleção de especificações db.collection.drop ()

espero que ajude

priya raj
fonte
1

eu prefiro

db.your_collection.remove({})

sobre

db.your_collection.drop()

Se a sua coleção for uma coleção especial, ou seja, uma coleção limitada ou uma coleção com um campo marcado como exclusivo, soltar limpará a própria coleção e, quando a coleção for criada novamente, será uma coleção comum. Você precisará definir as propriedades novamente. Portanto, use remove()para limpar os documentos sem remover a coleção e afetar o comportamento da coleção.

Sreeragh AR
fonte
1
Bons pontos. Vale ressaltar, porém, que drop()é quase instantâneo e remove({})bloqueia seu banco de dados por minutos ou dezenas de minutos (dependendo do tamanho da coleção).
Sergio Tulentsev 25/07/19
0

Para excluir todos os bancos de dados, use:

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

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

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

Documentação do MongoDB db.dropDatabase () explicando a modificação introduzida na 2.6:

Alterado na versão 2.6: Este comando não exclui os usuários associados ao banco de dados atual.

Antonio Bardazzi
fonte
0

No MongoDB 3.2 e mais recente, Mongo().getDBNames()no mongoshell será exibida uma lista de nomes de banco de dados no servidor:

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

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

UMA forEach() loop sobre a matriz poderia chamar dropDatabase()para eliminar todos os bancos de dados listados. Opcionalmente, você pode optar por ignorar alguns bancos de dados importantes que não deseja descartar. Por exemplo:

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

Exemplo de execução:

> 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
fonte