MongoDB删除每个数据库


97

我想知道是否有命令从MongoDB中删除每个数据库?

我知道如果我只想删除一个数据表,我只需要像下面的代码那样输入数据库的名称,但是我不想指定它。

mongo DB_NAME --eval 'db.dropDatabase();'

Answers:


142

您可以创建一个执行该任务的javascript循环,然后在mongoconsole中执行它。

var dbs = db.getMongo().getDBNames()
for(var i in dbs){
    db = db.getMongo().getDB( dbs[i] );
    print( "dropping db " + db.getName() );
    db.dropDatabase();
}

将其保存到dropall.js,然后执行:

mongo dropall.js

13
var mongo = db.getMongo(); mongo.getDBNames().forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });
tjmehta

3
您也可以只复制粘贴上面的代码,然后在mongo控制台上键入它。
Vivek Pandey,2015年

2
这删除了我的系统数据库(Mongo版本2.4.3)。我必须重新启动mongodb进程才能使其再次运行。
菲利克斯·施密特

7
我认为当有人要删除其数据库时,他们并不想删除mongo内部数据库,例如admin和local。
carlin.scott 2016年

另外,是配置数据库,用于存储事务。
罗德里戈·佩雷拉·弗拉加

103

试试这个命令:

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'

1
效果很好,您无需为其创建js文件。真好
Erik Honn 2013年

加载它的对称性是什么?
nha 2014年

我刚刚发现的这种方法的一个问题是db var在mongo控制台会话中仍然存在,因此,如果有人正在与其中一个数据库进行交互,则它将被db.getSiblingDB调用排除。
carlin.scott 2016年

3
真好 这对Docker非常适合:Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal,

我经历了同样的问题,发现这是自动化任务的最佳解决方案。您不希望编写新文件并在CI / CD管道中下载,因此单行脚本非常易于管理
Carmine Ingaldi

21

您也可以使用简单的mongo命令执行此操作:

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

无需为每个数据库编写if条件,我们可以简单地将其放入数组中并执行indexOf。
萨钦·古普塔

5

添加到@ALoR的答案中,为方便起见,您可以将以下内容放在〜/ .mongorc.js中

function dropDatabases(){
    var mongo = db.getMongo();

    var dbNames = mongo.getDBNames();
    for (var i = 0; i < dbNames.length; i++) {
        var db = mongo.getDB( dbNames[i] );

        print( "Dropping database " + db.getName() + "..." );
        db.dropDatabase();
    }
}

然后在mongo shell中,您只需

dropDatabases()

从文档:

Mongo将从调用mongo的用户的主目录中读取.mongorc.js文件。在文件中,用户可以定义变量,自定义mongo shell提示符或更新每次启动Shell时希望更新的信息。


我已进行更新以更正问题。感谢您的参与!
btiernay 2014年

5

将此保存到drop_all_dbs.js:

var databases = db.getMongo().getDBNames()
for(var i in databases){
    db = db.getMongo().getDB( databases[i] );
    if(db.getName() == "admin" || db.getName() == "local"){
        print("skipping db " + db.getName())
        continue
    }
    print( "dropping db " + db.getName() );
    db.dropDatabase();
}

现在您可以执行:

mongo drop_all_dbs.js

并且所有数据库(admin和local除外)都将被删除。

这个答案是ALoR的副本,只是修复了系统数据库的问题


4

您可以通过C#官方驱动程序轻松实现:

var _mongoServer = MongoServer.Create("mongodb://localhost:27020");

var names = _mongoServer.GetDatabaseNames();
foreach (var name in names)
{
   _mongoServer.DropDatabase(name);
}

是的,这可能是个主意,但我想在没有C#的情况下做到。(哦,对不起,我使用标签C#来解决此问题)
John

您可以创建一个执行该任务的javascript循环,然后在mongoconsole中执行它。
ALoR 2011年

2
@AndrewOrsich和@JohnSmith我已经发布了脚本。
ALoR 2011年

1

var mongo = db.getMongo(); mongo.getDBNames().filter(n => n != 'admin' && n != 'local' && n != 'config').forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });

这是可以安全地在mongoshell上复制和执行的代码。归功于以上所有答案。只需排除“ config”数据库。


-2

就像

mongo --eval 'db.dropDatabase()'

或者,您可以在终端上启动mongo会话并编写

db.dropDatabase()

完全一样。


问题是如何删除所有数据库,而不是单个数据库
Rob H
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.