MongoDB:删除名称与字符串匹配的所有集合
Posted
技术标签:
【中文标题】MongoDB:删除名称与字符串匹配的所有集合【英文标题】:MongoDB: Removing all collections whose name matches a string 【发布时间】:2012-10-11 16:45:21 【问题描述】:我对我的数据库进行了一些重组,不再需要某些集合。然而,它们太多了,无法手动移除(实际上是数千个)。每个有问题的集合都以“cache_”开头,并包含几个我想确保完全清理的索引。
我试图了解如何使用 mongo shell 来遍历所有集合名称并删除那些以“cache_”开头的集合。根据Queries & Cursors documentation,我了解如何遍历集合中的文档,但不了解如何使用 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()
或类似的操作,以确保删除的索引等都很好且干净?
谢谢。
【问题讨论】:
【参考方案1】:使用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()
【讨论】:
FTW,谢谢。我想我不知道 "show collections" => "db.getCollectionNames();" db[collectionName] 是这里的关键。 在 RoboMongo 上执行的 javascriptvar collections = ['collection1','collection2'] collections.forEach(function(coll_name) print(coll_name) db[coll_name].drop() )
【参考方案2】:
只是为了添加另一个答案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();
)
您可能不想删除我上面列出的 local/config/admin dbs。
【讨论】:
我做了:use toto
然后db.getSiblingDB("mydb").dropDatabase();
thx【参考方案3】:
以下内容对我来说非常有用,可以删除由 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 实例)。
【讨论】:
以上是关于MongoDB:删除名称与字符串匹配的所有集合的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 MongoDB 数据库中的所有集合以查找特定关键字?