Drop all indexes from all collections in a MongoDB database using the command line

Simon picture Simon · Jun 16, 2014 · Viewed 11.5k times · Source

I've used mongorestore to restore a database but I'm getting an error that the index already exists when I try to run my application.

I know of the function db.collection.dropIndex() but is there a way to automate this and drop all indexes from all collections in a database at once?

I've tried

db.getCollectionNames().forEach(function(col_name) {   
   var coll = db.getCollection(col_name);   
   coll.dropIndexes(); 
});

But that doesn't do the trick. Any ideas?

Answer

Christian P picture Christian P · Jun 16, 2014

Your command works for me (it drops all indexes on the currently selected DB). But you can also use this alternative.

db.getCollectionNames().forEach(function(collName) { 
    db.runCommand({dropIndexes: collName, index: "*"});
});

When dropping indexes only non _id indexes will be dropped.

Workaround solution is to drop the database and set --noIndexRestore flag when restoring with mongorestore so that the indexes are not restored.

From man mongorestore:

--noIndexRestore

New in version 2.2.

Prevents mongorestore from restoring and building indexes as specified in the corresponding mongodump output.