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

Mongodb 如何删除与已填充数据库同名的空Mongo数据库?,mongodb,Mongodb,我不小心创建了两个同名的数据库。当我在Mongo shell中显示dbs时,我得到以下结果: > show dbs admin (empty) local 0.078GB example_development (empty) example_development 0.078GB 有没有一种方法可以在不篡改已填充数据库的情况下删除空数据库 数据库名称不一样,只是其中有一个不可打印的字符,MongoShell的javascript接口正在为您抑制该字符 在mongo中,由驱动程序来确保用

我不小心创建了两个同名的数据库。当我在Mongo shell中显示dbs时,我得到以下结果:

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

有没有一种方法可以在不篡改已填充数据库的情况下删除空数据库

数据库名称不一样,只是其中有一个不可打印的字符,MongoShell的javascript接口正在为您抑制该字符

在mongo中,由驱动程序来确保用户不能向服务器提交非标准数据,但BSON在存储方面非常灵活

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

因为您很可能有一个不可打印的字符。但是,与直接从文件系统中删除文件不同,我更喜欢一种更具编程性的方法。这里的关键是永远不要真正按字面名称调用数据库,而是以变量形式保留对名称的引用:

  • 列出所有数据库
  • 筛选那些数据库以匹配您正在寻找的条件
  • 将结果列表(数组)转换为数据库名称
  • 选择有问题的数据库的特定索引(我想不出一种方法来迭代每个结果数据库并将
    getSiblingDB
    应用到每个数据库)
  • 将其传递到并发出一个
    db.dropDatabase
  • 工作示例 根据你的问题量身定做 我们希望通过
    sizenodisk
    进行过滤,而不是专门通过
    name
    进行过滤。请确保不要在此处选择“admin”,因此首先使用过滤器/映射运行
    adminCommand
    ,以获取适用的索引。“admin”很可能位于索引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
    

    这应该是不可能的。您是否可以编辑您的问题以包含来自
    db.adminCommand('listDatabases')
    的输出?
    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