我不小心创建了两个同名的数据库。当我在Mongo shell中show dbs
时,我得到了这个:
> show dbs
admin (empty)
local 0.078GB
example_development (empty)
example_development 0.078GB
有没有办法在不篡改填充的数据库的情况下删除空数据库?
答案 0 :(得分:1)
数据库名称不一样,只是其中有一个不可打印的字符,mongo shell的javascript界面正在为你压制。
在mongo中,由驱动程序确保用户无法向服务器提交非标准数据,但it has been demonstrated BSON在其可存储的内容方面非常灵活。
由于您正在谈论整个数据库,解决此问题的最简单方法是关闭mongo并删除数据库文件。您可以使用db.serverCmdLineOpts()
命令找到这些文件的位置。
答案 1 :(得分:0)
Wes Widner answer is correct因为你很可能有一个不可打印的角色。但是,我不是直接从文件系统中删除文件,而是采用更具编程性的方法。它们的关键是永远不会真正按其文字名称调用数据库,而是以变量形式保留对名称的引用:
getSiblingDB
应用于每个数据库)。db.getSiblingDB
并发出db.dropDatabase
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