MongoDB:删除名称与字符串匹配的所有集合

时间:2012-10-11 16:45:22

标签: mongodb

我对我的数据库进行了一些重组,不再需要某些集合。但是,有太多的东西要用手去除(实际上是数千个)。每个有问题的集合都以“cache_”开头,并包含一些我想确保完全清理的索引。

我正在尝试了解如何使用mongo shell来遍历所有集合名称并删除以“cache_”开头的那些集合。根据{{​​3}},我了解如何循环集合中的文档,而不是如何使用MongoDB shell循环遍历数据库中的集合。

在伪代码中,这就是我需要的:

var all_collections = show collections
for(var collection in all_collections)
    if(collection.name.indexOf('cache_')==0)
        collection.drop()

FWIW,我已经完成了搜索“通过集合名称的mongodb循环”等等并且没有找到任何东西,但也许我在googlez = P

在相关的说明中...在进行这种程度的重组之后,我应该做一个db.repairDatabase()或类似的任何事情,以确保丢弃的索引等都干净整洁吗?

感谢。

3 个答案:

答案 0 :(得分:24)

使用db.getCollectionNames()获取所有集合并将其存储在数组中。

var collectionNames = db.getCollectionNames();
for(var i = 0, len = collectionNames.length; i < len ; i++){
    var collectionName = collectionNames[i];
    if(collectionName.indexOf('cache_') == 0){
        db[collectionName].drop()
    }
}

答案 1 :(得分:1)

添加另一个答案on mongodb mailing list

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

您可能不想删除我上面列出的本地/ config / admin dbs。

答案 2 :(得分:0)

以下对我来说非常有效,可以删除map reduce作业创建的集合。在我的情况下,它们在本地设置中被自动删除,但出于任何原因在服务器上停留。

db.getCollectionNames().forEach( function (d) {
  if (d != "collectionICareAbout" && d != "system.indexes" && d != "system.users") {  
        print("dropping: " + d);
        db[d].drop();
  }
})

这类似于Nishant的回答,但区别在于我没有管理员权限,也无法调用db.adminCommand(托管的mongo实例)。