23

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?

Simon
  • 1,643
  • 7
  • 30
  • 61
  • 1
    Then go with db.dropDatabase; command if you want to start with fresh database...!!! – RubyOnRails Jun 16 '14 at 10:39
  • This happened to me with my Spring application. If you're using Spring, you might try upgrading your MongoDB drivers. I think the newer drivers address this, but I'm not positive since I used the below solution to destroy, and re-create, all my indexes. If I had more time, and wasn't like "Ohhhh no! Production is down!" I'd have tried upgrading my MongoDB drivers in a controlled, testing, environment, first. – Brian Stinar Apr 04 '21 at 19:23

2 Answers2

40

Your command works for me (it drops all indexes on the currently selected DB). 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.

Christian P
  • 12,032
  • 6
  • 60
  • 71
4

You can use this command to drop all the indexes from all the collections:

db.getCollectionNames().forEach(function (d) {
   db[d].dropIndexes();
});

Try this!

Reference link

Rahul Mankar
  • 910
  • 9
  • 17