13

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

我试图了解如何使用 mongo shell 来遍历所有集合名称并删除以“cache_”开头的那些集合。根据Queries & Cursors 文档,我了解如何遍历集合中的文档,但不了解如何使用 MongoDB shell 来遍历数据库中的集合。

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

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

FWIW,我已经完成了“mongodb loop through collection names”等的搜索,但没有找到任何东西,但也许我在 googlez =P

在相关的说明中......在进行了这种程度的重组之后,我应该做一个db.repairDatabase()或任何事情以确保删除的索引等都很好而且干净吗?

谢谢。

4

3 回答 3

28

用于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()
    }
}
于 2012-10-11T16:52:53.380 回答
1

只是为了添加在 mongodb 邮件列表中找到的另一个答案

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

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

于 2013-02-15T09:22:40.477 回答
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 实例)。

于 2013-09-06T21:27:07.777 回答