I'm doing development on MongoDB. For totally non-evil purposes, I sometimes want to blow away everything in a database—that is, to delete every single collection, and whatever else might be lying around, and start from scratch. Is there a single line of code that will let me do this? Bonus points for giving both a MongoDB console method and a MongoDB Ruby driver method.
17 Answers
In the mongo shell:
use [database];
db.dropDatabase();
And to remove the users:
db.dropAllUsers();
-
36@connorbode Thanks for this. I've read it and immediately though: **"B-But OP doesn't wants to remove the database!"**. Very misleading command !! – Henrique Miranda Nov 25 '15 at 13:56
-
1Use with caution: if you're in a sharded environment using wiredTiger and you have no user database and you invoke dropDatabase, the database will be deleted and could re-appear as primary on a different shard when new records are added. – Jason R. Coombs Aug 04 '16 at 14:50
-
5This won't delete the user that is attached to related database. So you may want to delete it manually. `db.dropAllUsers();` – Fırat Küçük Nov 11 '16 at 09:13
-
4Note that the database will not show after using the "use dbs" command. However, it is there. So, no worries. – womplefrog Apr 03 '17 at 17:45
-
3@StepanYakovenko Probably need to authenticate with the MongoDB instance – Josh K Jul 25 '19 at 16:36
Also, from the command line:
mongo DATABASE_NAME --eval "db.dropDatabase();"

- 3,130
- 2
- 20
- 23

- 36,864
- 16
- 117
- 117
I had the same problem, when I needed to reset all the collections but didn't want to loose any database users. Use the following line of code, if you would like to save the user configuration for the database:
use <whichever database>
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db[c].drop(); })
This code will go through all collection names from one database and drop those which do not start with "system.".

- 3,010
- 3
- 21
- 23
-
3As mentioned by @DanH you may find it more reliable to use `remove` in place of `drop`. The `remove` option appears to maintain constraints on fields the the collections that you are clearing. When we employed the `drop` method, the `unique` constraint on one of our fields was not honoured following the drop. – Scottymac Jan 16 '15 at 18:24
-
1@Scottymac - better yet, add an `else` branch (to the `if (c.indexOf("system.") == -1)`) that does `remove` instead of `drop`. That way you're not left with empty collections if you're not using them anymore – Bogdan D Jan 21 '15 at 11:58
-
4Better than `db[c]`, use `db.getCollection(c)` which avoids [errors when collection names are digits](http://stackoverflow.com/a/24657123/70170). – Jason R. Coombs Aug 01 '16 at 16:32
-
2According to [the docs](https://docs.mongodb.com/manual/reference/command/dropDatabase/#behavior), since MongoDB 2.6, a dropDatabase command won't delete users, so the accepted answer is probably preferable. – Jason R. Coombs Aug 01 '16 at 16:37
-
4If the collection name is numeric, then this should work instead: `db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })` – Constantin Galbenu Dec 08 '16 at 10:29
-
1A pernickative observation: `(c.indexOf("system.") == -1)` looks for the substring in any part of the collection name, i.e. the loop would avoid the deletion of "not.a.system.collection" too. A `!=0` condition could be better suited...? – brezniczky Nov 26 '18 at 23:03
I followed the db.dropDatabase()
route for a long time, however if you're trying to use this for wiping the database in between test cases you may eventually find problems with index constraints not being honored after the database drop. As a result, you'll either need to mess about with ensureIndexes, or a simpler route would be avoiding the dropDatabase alltogether and just removing from each collection in a loop such as:
db.getCollectionNames().forEach(
function(collection_name) {
db[collection_name].remove()
}
);
In my case I was running this from the command-line using:
mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"

- 5,397
- 22
- 42

- 5,498
- 4
- 49
- 72
-
2Thank you for this suggestion, we were using `db[collection_name].drop()` and it was exhibiting the same issues you described with the `db.dropDatabase()` method. Switching the `s/drop/remove/` worked brilliantly ! – Scottymac Jan 16 '15 at 16:35
-
15I found that `remove()` doesn't work well on MongoDB for Windows, and instead I needed to do `remove({})` which works on both OSX and Windows. – DanH Jan 19 '15 at 03:23
-
1Thanks for the tip, we are on a Linux platform, but this is worth looking into a bit further. – Scottymac Jan 19 '15 at 13:19
-
4I noticed an error for the delete - since db[collection_name].remove() doesn't have a query! So it actually needs to be: db[collection_name].remove({}) – JoelParke Oct 06 '16 at 22:47
By compiling answers from @Robse and @DanH (kudos!), I've got the following solution which completely satisfies me:
db.getCollectionNames().forEach( function(collection_name) {
if (collection_name.indexOf("system.") == -1)
db[collection_name].drop();
else
db[collection_name].remove({});
});
It cleans the database by dropping the user collections and emptying the system collections.
-
1This script cleans everything within only one particular Mongo database. It erases all collections in this database. – staskrak Jun 17 '18 at 07:33
Here are some useful delete operations for mongodb using mongo shell
To delete particular document in collections: db.mycollection.remove( {name:"stack"} )
To delete all documents in collections: db.mycollection.remove()
To delete any particular collection : db.mycollection.drop()
to delete database :
first go to that database by use mydb
command and then
db.dropDatabase()

- 25
- 4

- 5,188
- 3
- 35
- 44
in case you'd need to drop everything at once: (drop all databases at once)
mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'

- 18,644
- 14
- 87
- 92
Use
[databaseName]
db.Drop+databaseName();
drop collection
use databaseName
db.collectionName.drop();

- 20,469
- 14
- 82
- 108

- 91
- 1
- 1
if you want to delete only a database and its sub-collections use this :
use <database name>;
db.dropDatabase();
if you want to delete all the databases in mongo then use this :
db.adminCommand("listDatabases").databases.forEach(function(d)
{
if(d.name!="admin" && d.name!="local" && d.name!="config")
{
db.getSiblingDB(d.name).dropDatabase();
}
}
);

- 21,706
- 14
- 92
- 130
I prefer
db.your_collection.remove({})
over
db.your_collection.drop()
If your collection was a special collection
i.e a capped collection or a collection with one field marked as unique, dropping will clear the collection itself and when collection is again created it will be an ordinary collection. You will have to define the properties again.
So use remove()
to clear the documents without removing the collection and affecting the behavior of the collection.

- 226,338
- 43
- 373
- 367

- 2,871
- 3
- 27
- 54
-
1Good points. It's worth mentioning, though, that `drop()` is near-instantaneous and `remove({})` locks up your db for minutes or tens of minutes (depending on collection size). – Sergio Tulentsev Jul 25 '18 at 17:58
Simplest way to delete a database say blog:
> use blog
switched to db blog
> db.dropDatabase();
{ "dropped" : "blog", "ok" : 1 }

- 354
- 2
- 8
For Meteor developers.
Open a second terminal window while running your app in
localhost:3000
.In your project's folder run,
meteor mongo
.coolName = new Mongo.Collection('yourCollectionName');
Then simply enter
db.yourCollectionName.drop();
You'll automatically see the changes in your local server.
For everybody else.
db.yourCollectionName.drop();

- 1
- 1

- 948
- 11
- 19
To delete all DBs use:
for i in $(mongo --quiet --host $HOSTNAME --eval "db.getMongo().getDBNames()" | tr "," " ");
do mongo $i --host $HOSTNAME --eval "db.dropDatabase()";
done

- 89
- 5

- 431
- 4
- 5
- List out all available dbs show dbs
- Choose the necessary db use
- Drop the database db.dropDatabase() //Few additional commands
- List all collections available in a db show collections
- Remove a specification collection db.collection.drop()
Hope that helps

- 362
- 2
- 8
use <dbname>
db.dropAllUsers()
db.dropAllRoles()
db.dropDatabase()
MongoDB db.dropDatabase() documentation explaining the modification introduced in 2.6:
Changed in version 2.6: This command does not delete the users associated with the current database.

- 2,996
- 1
- 23
- 20
In MongoDB 3.2 and newer, Mongo().getDBNames()
in the mongo
shell will output a list of database names in the server:
> Mongo().getDBNames()
[ "local", "test", "test2", "test3" ]
> show dbs
local 0.000GB
test 0.000GB
test2 0.000GB
test3 0.000GB
A forEach()
loop over the array could then call dropDatabase()
to drop all the listed databases. Optionally you can opt to skip some important databases that you don't want to drop. For example:
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();
}
})
Example run:
> 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

- 13,365
- 3
- 33
- 49