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.

Respostas:


588

Na casca do mongo:

use [database];
db.dropDatabase();

E para remover os usuários:

db.dropAllUsers();

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

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".


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

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.


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

8

Usar

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();

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


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

Ó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 }

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


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


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.


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 


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.