2010-07-29 7 views
363

Je suis en développement sur MongoDB. À des fins totalement non-malveillantes, je veux parfois tout balayer dans une base de données, c'est-à-dire supprimer toutes les collections, et tout ce qui traîne ailleurs, et recommencer à zéro. Y a-t-il une seule ligne de code qui me laisse faire ça? Points bonus pour donner à la fois une méthode de console MongoDB et une méthode de pilote MongoDB Ruby.Tout supprimer dans une base de données MongoDB

Répondre

492

Dans le shell mongo:

use [database]; 
db.dropDatabase(); 

Ruby code is pretty similar.

+34

Remarque : Ceci ne supprimera pas la base de données, seulement tout son contenu. – connorbode

+13

@connorbode Merci pour ça. Je l'ai lu et immédiatement: ** "B-Mais OP ne veut pas supprimer la base de données!" **. Commande très trompeuse !! –

+0

À utiliser avec précaution: si vous êtes dans un environnement fragmenté avec wiredTiger et que vous n'avez pas de base de données utilisateur et que vous invoquez dropDatabase, la base de données sera supprimée et pourra réapparaître comme primaire sur un fragment différent lorsque de nouveaux enregistrements sont ajoutés. –

98

En outre, à partir de la ligne de commande:

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

Je ne crois pas que cela fonctionne en 2.4.6. Mes enregistrements existent toujours. –

8

Utilisez

[databaseName] 
db.Drop+databaseName(); 

drop collection 

use databaseName 
db.collectionName.drop(); 
9

Entendre quelques utiliser des opérations complètes de suppression pour MongoDB en utilisant shell mongo

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

Pour effacer tous les documents dans les collections: db.mycollection.remove()

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

pour supprimer la base de données: premier rendez-vous à cette base de données par commande use mydb puis

db.dropDatabase() 
48

J'ai eu le même problème, quand je avais besoin de réinitialiser toutes les collections mais ne voulait pas perdre d'utilisateurs de base de données. Utilisez la ligne de code suivante, si vous souhaitez enregistrer la configuration de l'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 déposez ceux qui ne commence pas par « système ». .

+2

Comme mentionné par @DanH, vous pouvez trouver plus fiable d'utiliser 'remove' à la place de' drop'. L'option 'remove' semble maintenir des contraintes sur les champs des collections que vous effacez. Lorsque nous avons utilisé la méthode 'drop', la contrainte' unique' sur l'un de nos champs n'a pas été respectée après la suppression. – Scottymac

+0

@Scottymac - mieux encore, ajoutez une branche 'else' (au' si (c.indexOf ("system.") == -1) ') qui fait' remove' au lieu de 'drop'. De cette façon, il ne vous reste plus de collections vides si vous ne les utilisez plus –

+0

Mieux que 'db [c]', utilisez 'db.getCollection (c)' qui évite [les erreurs lorsque les noms de collection sont des chiffres] (http: //stackoverflow.com/a/24657123/70170). –

4

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

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

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

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

Bonne réponse ... c'est probablement ce que l'utilisateur recevait à – robert

27

J'ai suivi le db.dropDatabase() itinéraire pendant une longue période, cependant si vous essayez d'utiliser ceci pour effacer la base de données entre les cas de test, vous pouvez éventuellement trouver des problèmes avec les contraintes d'index qui ne sont pas honorées après la suppression de la base de données.Par conséquent, vous aurez besoin soit de déconner avec ensureIndexes, ou un itinéraire plus simple serait d'éviter la DropDatabase alltogether et juste retirer de chaque collection dans une boucle telle que:

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

Dans mon cas, je courais ce de la ligne de commande en utilisant:

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

Merci pour cette suggestion, nous utilisions' db [collection_name] .drop() 'et il présentait les mêmes problèmes vous l'avez décrit avec la méthode 'db.dropDatabase()'. Changer le 's/drop/remove /' a fonctionné avec brio! – Scottymac

+4

J'ai trouvé que 'remove()' ne fonctionne pas bien sur MongoDB pour Windows, et que j'ai dû faire 'remove ({})' qui fonctionne à la fois sur OSX et sur Windows. – DanH

+0

Merci pour le conseil, nous sommes sur une plate-forme Linux, mais cela vaut la peine d'examiner un peu plus loin. – Scottymac

13

En compilant les réponses de @Robse et @DanH (!) kudos, 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.

+0

Cela fonctionne plutôt bien. Exactement ce dont j'avais besoin. –

1

Simplest moyen de supprimer une base de données dire blog:

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

Pour les développeurs Meteor.

  1. Ouvrez une seconde fenêtre de terminal lors de l'exécution de votre application dans localhost:3000. Dans le dossier de votre projet, exécutez meteor mongo.

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

  2. simplement Entrez ensuite db.yourCollectionName.drop();

  3. Vous verrez automatiquement les changements dans votre serveur local.

Pour tout le monde.

db.yourCollectionName.drop();

0

Pour supprimer tous les blocs de données utilisent:

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

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

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

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

Changé dans la version 2.6: Cette commande ne supprime pas les utilisateurs associés à la base de données en cours.

1
  1. Liste tous les dbs disponibles dbs show
  2. Choisissez le nécessaire db utilisation
  3. supprimer la base db.DropDatabase() // quelques commandes supplémentaires
  4. Liste toutes les collections disponibles dans une base collections montrent
  5. Supprimer une collection de spécifications db.collection.drop()

espoir qui aide

Questions connexes