如何删除与填充数据库同名的空Mongo数据库?

时间:2014-09-06 02:48:19

标签: mongodb

我不小心创建了两个同名的数据库。当我在Mongo shell中show dbs时,我得到了这个:

> show dbs
admin (empty)
local 0.078GB
example_development (empty)
example_development 0.078GB

有没有办法在不篡改填充的数据库的情况下删除空数据库?

2 个答案:

答案 0 :(得分:1)

数据库名称不一样,只是其中有一个不可打印的字符,mongo shell的javascript界面​​正在为你压制。

在mongo中,由驱动程序确保用户无法向服务器提交非标准数据,但it has been demonstrated BSON在其可存储的内容方面非常灵活。

由于您正在谈论整个数据库,解决此问题的最简单方法是关闭mongo并删除数据库文件。您可以使用db.serverCmdLineOpts()命令找到这些文件的位置。

答案 1 :(得分:0)

Wes Widner answer is correct因为你很可能有一个不可打印的角色。但是,我不是直接从文件系统中删除文件,而是采用更具编程性的方法。它们的关键是永远不会真正按其文字名称调用数据库,而是以变量形式保留对名称的引用:

  1. 列出所有数据库
  2. 过滤这些数据库以符合您正在寻找的标准
  3. 将结果列表(数组)转换为数据库名称
  4. 选择有问题的数据库的特定索引(我无法找到迭代每个结果数据库的方法并将getSiblingDB应用于每个数据库)。
  5. 将其传递到db.getSiblingDB并发出db.dropDatabase
  6. 工作示例

    use bogus;
    db.createCollection('blah');
    db.getCollectionNames(); // [ "blah", "system.indexes" ]
    
    use admin;
    db.adminCommand({listDatabases:1}).databases.filter(function(d){
        return d.name === 'bogus';
    }).map(function(d){
        return d.name;
    }); // [ "bogus" ]
    
    
    // use [0] here since we now 'bogus' was at index 0 in previous
    // getSiblingDB will allow us to issue dropDatabase on the string
    // representation of the database
    db.getSiblingDB(db.adminCommand({listDatabases:1}).databases.filter(function(d){
        return d.name === 'bogus';
    }).map(function(d){
        return d.name;
    })[0]).dropDatabase();
    

    根据您的问题定制

    我们希望按name进行过滤,而不是按sizeOnDisk专门过滤。一定不要选择" admin"在这里,首先使用filter / map运行adminCommand以获取适用的索引。机会是"管理员"将在索引0处,因此您的数据库很可能位于索引1:

    db.getSiblingDB(db.adminCommand({listDatabases:1}).databases.filter(function(d){
        return !d.sizeOnDisk;
    }).map(function(d){
        return d.name;
    })[1]).dropDatabase(); // note usage of [1] here