删除MongoDB数据库中的所有内容


454

我正在MongoDB上进行开发。出于完全非邪恶的目的,有时我想删除数据库中的所有内容,也就是说,删除每个集合,以及可能存在的所有其他内容,并从头开始。有没有一行代码可以让我做到这一点?同时提供MongoDB控制台方法和MongoDB Ruby驱动程序方法的加分点。

Answers:


587

在mongo shell中:

use [database];
db.dropDatabase();

并删除用户:

db.dropAllUsers();

23
@connorbode谢谢你。我已经阅读并立即阅读:“ B,但是OP不想删除数据库!” 。非常误导的命令!
Henrique Miranda

请谨慎使用:如果您处于使用wiredTiger的分片环境中,并且没有用户数据库,并且调用dropDatabase,则该数据库将被删除,并在添加新记录时可以在另一个分片上重新显示为主数据库。
杰森·库姆斯

2
这不会删除附加到相关数据库的用户。因此,您可能需要手动删除它。db.dropAllUsers();
的Firat KUCUK

2
请注意,使用“ use dbs”命令后,数据库将不会显示。但是,它在那里。因此,不用担心。
wynshaft '17

@StepanYakovenko可能需要通过MongoDB实例进行身份验证
Josh K


67

当我需要重置所有集合但又不想丢失任何数据库用户时,我遇到了同样的问题。如果要保存数据库的用户配置,请使用以下代码行:

use <whichever database>
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db[c].drop(); })

此代码将遍历一个数据库中的所有集合名称,并删除不以“ system”开头的集合名称。


2
如@DanH所述,您可能会发现使用remove它代替更加可靠drop。该remove选项似乎在维护您要清除的集合的字段上的约束。当我们采用该 drop方法时,unique在下降之后,对我们其中一个领域的约束就不成立。
Scottymac

@Scottymac -更好的是,添加一个else分支(对if (c.indexOf("system.") == -1),做)remove代替drop。如果你不使用他们了你不空的藏品留这样
波格丹d

1
最好db[c]使用db.getCollection(c),这样可以避免在集合名称为数字时出错
杰森·库姆斯

1
根据docs所述,自MongoDB 2.6起,dropDatabase命令不会删除用户,因此可接受的答案可能是更可取的。
杰森·库姆斯

1
如果集合名称是数字,则应改为:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu

35

我遵循db.dropDatabase()了很长时间,但是如果您试图在测试用例之间使用它来擦拭数据库,则可能最终会发现数据库删除后索引约束得不到满足的问题。结果,您可能需要弄乱确保索引,或者更简单的方法是一起避免dropDatabase,而只是在循环中从每个集合中删除,例如:

db.getCollectionNames().forEach(
  function(collection_name) {
    db[collection_name].remove()
  }
);

就我而言,我是使用以下命令从命令行运行的:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"

1
谢谢您的建议,我们正在使用db[collection_name].drop()它,它所显示的问题与您描述的db.dropDatabase()方法相同。切换 s/drop/remove/工作出色!
Scottymac

10
我发现这remove()在Windows的MongoDB上无法正常运行,而是需要remove({})在OSX和Windows上都可以正常运行。
DanH 2015年

感谢您提供的技巧,我们使用的是Linux平台,但是值得进一步研究。
Scottymac

2
我注意到删除操作出错-因为db [collection_name] .remove()没有查询!因此,实际上它需要是:db [collection_name] .remove({})
JoelParke'Oct 6''16

16

通过编译来自@Robse和@DanH的答案(非常感谢!),我得到了以下解决方案,这些解决方案使我完全满意:

db.getCollectionNames().forEach( function(collection_name) { 
  if (collection_name.indexOf("system.") == -1) 
       db[collection_name].drop();
  else  
       db.collection_name.remove({}); 
});

连接到您的数据库,运行代码。

它通过删除用户集合并清空系统集合来清理数据库。


该脚本仅清除一个特定的Mongo数据库中的所有内容。它将擦除此数据库中的所有集合。
staskrak

10

听到一些使用mongo shell对mongodb使用完全删除操作的信息

要删除集合中的特定文档: db.mycollection.remove( {name:"stack"} )

删除集合中的所有文档: db.mycollection.remove()

删除收藏集: db.mycollection.drop()

删除数据库:首先通过use mydb命令进入该数据库,然后

db.dropDatabase()


7

万一您需要一次删除所有内容:(一次删除所有数据库)

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


5

如果只想删除数据库及其子集合,请使用以下命令:

  • use <database name>;
  • db.dropDatabase();

如果要删除mongo中的所有数据库,请使用以下命令:

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

很好的答案...这可能是用户所得到的
罗伯特


1

对于流星开发者。

  1. 在中运行您的应用程序时,打开第二个终端窗口localhost:3000

  2. 在项目的文件夹中,运行meteor mongo

    coolName = new Mongo.Collection('yourCollectionName');

  3. 然后只需输入 db.yourCollectionName.drop();

  4. 您将自动在本地服务器中看到更改。

对于其他人。

db.yourCollectionName.drop();


1
  1. 列出所有可用的数据库显示数据库
  2. 选择必要的数据库使用
  3. 删除数据库db.dropDatabase()//很少有其他命令
  4. 列出db show集合中可用的所有集合
  5. 除去规范集合db.collection.drop()

希望能有所帮助


1

我更喜欢

db.your_collection.remove({})

过度

db.your_collection.drop()

如果您的收藏是特殊收藏,即封顶收藏或一个字段标记为唯一的收藏,则删除将清除收藏本身,并且当再次创建收藏时,它将是普通收藏。您将不得不再次定义属性。因此,用于remove()清除文档而不删除集合并影响集合的行为。


1
好点。不过,值得一提的是,这drop()几乎是瞬时的,它remove({})会将数据库锁定几分钟或几十分钟(取决于集合大小)。
塞尔吉奥·图伦采夫

0

要删除所有数据库,请使用:

for i in $(mongo --quiet --host $HOSTNAME --eval "db.getMongo().getDBNames()" | tr "," " ");

do mongo $i --host $HOSTNAME --eval "db.dropDatabase()";

done 


0

在MongoDB 3.2和更高版本Mongo().getDBNames()中,mongoshell将在服务器中输出数据库名称列表:

> Mongo().getDBNames()
[ "local", "test", "test2", "test3" ]

> show dbs
local  0.000GB
test   0.000GB
test2  0.000GB
test3  0.000GB

forEach()则在阵列上环可以调用dropDatabase()删除所有列出的数据库。(可选)您可以选择跳过一些不想删除的重要数据库。例如:

Mongo().getDBNames().forEach(function(x) {
  // Loop through all database names
  if (['admin', 'config', 'local'].indexOf(x) < 0) {
    // Drop if database is not admin, config, or local
    Mongo().getDB(x).dropDatabase();
  }
})

示例运行:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
test2   0.000GB
test3   0.000GB

> Mongo().getDBNames().forEach(function(x) {
...   if (['admin', 'config', 'local'].indexOf(x) < 0) {
...     Mongo().getDB(x).dropDatabase();
...   }
... })

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
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.