我对我的数据库进行了一些重组,不再需要某些集合。但是,有太多的东西要用手去除(实际上是数千个)。每个有问题的集合都以“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()
或类似的任何事情,以确保丢弃的索引等都干净整洁吗?
感谢。
答案 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实例)。