21

我已经使用 mongorestore 来恢复数据库,但是当我尝试运行我的应用程序时,我收到一个错误,即索引已经存在。

我知道函数 db.collection.dropIndex() 但有没有办法自动化这个并立即从数据库中的所有集合中删除所有索引?

我试过了

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

但这并不能解决问题。有任何想法吗?

4

2 回答 2

36

您的命令对我有用(它会删除当前选定数据库上的所有索引)。但您也可以使用此替代方法。

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

删除索引时,只会删除非_id索引。

解决方法是--noIndexRestore在还原时删除数据库并设置标志,mongorestore以便不还原索引。

来自man mongorestore

--noIndexRestore

2.2 版中的新功能。

防止 mongorestore 恢复和构建相应 mongodump 输出中指定的索引。

于 2014-06-16T11:00:28.687 回答
3

您可以使用此命令从所有集合中删除所有索引:

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

尝试这个!

参考链接

于 2017-05-31T11:19:23.603 回答