Supprimer tout dans une base de données MongoDB

454

Je fais du développement sur MongoDB. À des fins totalement non perverses, je veux parfois tout effacer dans une base de données, c'est-à-dire supprimer toutes les collections et tout ce qui pourrait traîner et recommencer à zéro. Y a-t-il une seule ligne de code qui me permettra de faire cela? Points bonus pour donner à la fois une méthode de console MongoDB et une méthode de pilote MongoDB Ruby.

Trevor Burnham
la source

Réponses:

588

Dans la coquille mongo:

use [database];
db.dropDatabase();

Et pour supprimer les utilisateurs:

db.dropAllUsers();
Josh K
la source
23
@connorbode Merci pour cela. Je l'ai lu et tout de suite cependant: "B-But OP ne veut pas supprimer la base de données!" . Commande très trompeuse !!
Henrique Miranda
À utiliser avec prudence: si vous êtes dans un environnement fragmenté utilisant wiredTiger et que vous n'avez pas de base de données utilisateur et que vous appelez dropDatabase, la base de données sera supprimée et pourrait réapparaître comme principale sur un fragment différent lorsque de nouveaux enregistrements sont ajoutés.
Jason R. Coombs
2
Cela ne supprimera pas l'utilisateur attaché à la base de données associée. Vous pouvez donc vouloir le supprimer manuellement. db.dropAllUsers();
Fırat KÜÇÜK
2
Notez que la base de données ne s'affichera pas après avoir utilisé la commande "use dbs". Mais c'est là. Donc, pas de soucis.
wynshaft le
@StepanYakovenko Probablement besoin de s'authentifier avec l'instance MongoDB
Josh K
114

En outre, à partir de la ligne de commande:

mongo DATABASE_NAME --eval "db.dropDatabase();"
Rimian
la source
5
Je ne pense pas que cela fonctionne en 2.4.6. Mes enregistrements existent toujours.
Brandon Clark
Cela éloignera-t-il également les utilisateurs de la base de données?
Gert van den Berg,
67

J'ai eu le même problème, quand j'ai dû réinitialiser toutes les collections, mais je ne voulais pas perdre d'utilisateurs de base de données. Utilisez la ligne de code suivante, si vous souhaitez enregistrer la configuration utilisateur pour la base de données:

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

Ce code passera par tous les noms de collection d'une base de données et supprimera ceux qui ne commencent pas par «système».

Gering
la source
2
Comme mentionné par @DanH, vous pouvez le trouver plus fiable à la removeplace de drop. L' removeoption semble conserver les contraintes sur les champs des collections que vous effacez. Lorsque nous avons utilisé la dropméthode, la uniquecontrainte sur l'un de nos champs n'a pas été respectée après la baisse.
Scottymac
@Scottymac - mieux encore, ajoutez une elsebranche (à la if (c.indexOf("system.") == -1)) qui fait à la removeplace de drop. De cette façon, vous ne vous retrouvez pas avec des collections vides si vous ne les utilisez plus
Bogdan D
1
Mieux que db[c], utilisez db.getCollection(c)ce qui évite les erreurs lorsque les noms de collection sont des chiffres .
Jason R. Coombs
1
Selon les documents , depuis MongoDB 2.6, une commande dropDatabase ne supprimera pas les utilisateurs, donc la réponse acceptée est probablement préférable.
Jason R. Coombs
1
Si le nom de la collection est numérique, alors cela devrait fonctionner à la place:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu
35

J'ai suivi l' db.dropDatabase()itinéraire pendant une longue période, mais si vous essayez de l'utiliser pour effacer la base de données entre les cas de test, vous pouvez éventuellement trouver des problèmes avec les contraintes d'index non respectées après la suppression de la base de données. En conséquence, vous devrez soit jouer avec EnsureIndexes, soit une route plus simple éviterait complètement dropDatabase et supprimerait simplement de chaque collection dans une boucle telle que:

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

Dans mon cas, je l'exécutais à partir de la ligne de commande en utilisant:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"
DanH
la source
1
Merci pour cette suggestion, nous l'utilisions db[collection_name].drop()et elle présentait les mêmes problèmes que vous avez décrits avec la db.dropDatabase()méthode. Changer de s/drop/remove/fonction avec brio!
Scottymac
10
J'ai trouvé que remove()cela ne fonctionnait pas bien sur MongoDB pour Windows, et à la place, je devais faire ce remove({})qui fonctionne à la fois sur OSX et Windows.
DanH
Merci pour l'astuce, nous sommes sur une plate-forme Linux, mais cela mérite d'être approfondi.
Scottymac
2
J'ai remarqué une erreur pour la suppression - puisque db [nom_collection] .remove () n'a pas de requête! Il doit donc être: db [nom_collection] .remove ({})
JoelParke
16

En compilant les réponses de @Robse et @DanH (bravo!), J'ai la solution suivante qui me satisfait complètement:

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

Connectez-vous à votre base de données, exécutez le code.

Il nettoie la base de données en supprimant les collections d'utilisateurs et en vidant les collections système.

Bogdan D
la source
Ce script nettoie tout dans une seule base de données Mongo particulière. Il efface toutes les collections de cette base de données.
staskrak
10

Écoutez, certaines utilisent des opérations de suppression complète pour mongodb en utilisant mongo shell

Pour supprimer un document particulier dans des collections: db.mycollection.remove( {name:"stack"} )

Pour supprimer tous les documents des collections: db.mycollection.remove()

Pour supprimer une collection: db.mycollection.drop()

pour supprimer la base de données: accédez d'abord à cette base de données par use mydbcommande, puis

db.dropDatabase()
bhv
la source
8

Utilisation

[databaseName]
db.Drop+databaseName();

drop collection 

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

au cas où vous auriez besoin de tout supprimer à la fois: (supprimez toutes les bases de données à la fois)

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

si vous souhaitez supprimer uniquement une base de données et ses sous-collections, utilisez ceci:

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

si vous souhaitez supprimer toutes les bases de données de mongo, utilisez ceci:

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
la source
Excellente réponse ... c'est probablement ce à quoi l'utilisateur voulait en venir
robert
1

Le moyen le plus simple de supprimer une base de données est le blog:

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

Pour les développeurs Meteor.

  1. Ouvrez une deuxième fenêtre de terminal lors de l'exécution de votre application dans localhost:3000 .

  2. Dans le dossier de votre projet, exécutez meteor mongo.

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

  3. Entrez simplement db.yourCollectionName.drop();

  4. Vous verrez automatiquement les modifications sur votre serveur local.

Pour tout le monde.

db.yourCollectionName.drop();

Felipe Alarcon
la source
1
  1. Liste de tous les dbs disponibles
  2. Choisissez l'utilisation nécessaire de la base de données
  3. Supprimez la base de données db.dropDatabase () // Quelques commandes supplémentaires
  4. Liste de toutes les collections disponibles dans une collection db show
  5. Supprimer une collection de spécifications db.collection.drop ()

J'espère que cela pourra aider

priya raj
la source
1

je préfère

db.your_collection.remove({})

plus de

db.your_collection.drop()

Si votre collection était une collection spéciale, c'est-à-dire une collection plafonnée ou une collection avec un champ marqué comme unique, la suppression effacera la collection elle-même et lorsque la collection sera à nouveau créée, ce sera une collection ordinaire. Vous devrez à nouveau définir les propriétés. Utilisez donc remove()pour effacer les documents sans supprimer la collection et sans affecter le comportement de la collection.

Sreeragh AR
la source
1
Bons points. Il convient de mentionner, cependant, que drop()c'est presque instantané et remove({})verrouille votre base de données pendant des minutes ou des dizaines de minutes (selon la taille de la collection).
Sergio Tulentsev
0

Pour supprimer toutes les bases de données, utilisez:

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

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

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

Documentation MongoDB db.dropDatabase () expliquant la modification introduite en 2.6:

Modifié dans la version 2.6: cette commande ne supprime pas les utilisateurs associés à la base de données actuelle.

Antonio Bardazzi
la source
0

Dans MongoDB 3.2 et plus récent, Mongo().getDBNames()le mongoshell affichera une liste de noms de base de données sur le serveur:

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

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

Une forEach()boucle sur le tableau pourrait alors appeler dropDatabase()pour supprimer toutes les bases de données répertoriées. En option, vous pouvez choisir d'ignorer certaines bases de données importantes que vous ne souhaitez pas supprimer. Par exemple:

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

Exemple d'exécution:

> 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
la source