【问题标题】:Delete everything in a MongoDB database删除 MongoDB 数据库中的所有内容
【发布时间】:2011-03-22 22:30:33
【问题描述】:

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

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    在 mongo 外壳中:

    use [database];
    db.dropDatabase();
    

    并删除用户:

    db.dropAllUsers();
    

    【讨论】:

    • @connorbode 谢谢。我已经阅读了它并且立即:“B-但是 OP 不想删除数据库!”。非常误导的命令!
    • 谨慎使用:如果您在使用wiredTiger的分片环境中并且您没有用户数据库并且您调用dropDatabase,则该数据库将被删除并且可能在以下情况下重新显示为不同分片上的主数据库添加新记录。
    • 这不会删除附加到相关数据库的用户。因此,您可能需要手动删除它。 db.dropAllUsers();
    • 请注意,使用“use dbs”命令后数据库不会显示。然而,它就在那里。所以,不用担心。
    • @StepanYakovenko 可能需要对 MongoDB 实例进行身份验证
    【解决方案2】:

    另外,从命令行:

    mongo DATABASE_NAME --eval "db.dropDatabase();"
    

    【讨论】:

    • 我不相信这在 2.4.6 中有效。我的记录仍然存在。
    • 这是否也会远程访问数据库中的用户?
    【解决方案3】:

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

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

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

    【讨论】:

    • 正如@DanH 提到的,您可能会发现使用remove 代替drop 更可靠。 remove 选项似乎保持对您正在清除的集合的字段的约束。当我们使用drop 方法时,我们的一个字段上的unique 约束在下降后没有得到遵守。
    • @Scottymac - 更好的是,添加一个else 分支(到if (c.indexOf("system.") == -1)),它执行remove 而不是drop。这样,如果您不再使用它们,您就不会留下空集合
    • 优于db[c],使用db.getCollection(c),避免errors when collection names are digits
    • 根据the docs,从MongoDB 2.6开始,dropDatabase命令不会删除用户,所以接受的答案可能更可取。
    • 如果集合名称是数字,那么这应该可以代替:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
    【解决方案4】:

    我遵循db.dropDatabase() 路线很长一段时间,但是如果您尝试在测试用例之间使用它来擦除数据库,您最终可能会发现在数据库删除后索引约束没有得到遵守的问题。因此,您要么需要弄乱 ensureIndexes,要么更简单的方法是完全避免 dropDatabase 并在循环中从每个集合中删除,例如:

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

    在我的例子中,我是从命令行运行这个的:

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

    【讨论】:

    • 感谢您的建议,我们使用的是 db[collection_name].drop(),它与您使用 db.dropDatabase() 方法描述的问题相同。切换s/drop/remove/ 效果很好!
    • 我发现remove() 在 MongoDB for Windows 上不能很好地工作,我需要做remove({}),它在 OSX 和 Windows 上都可以工作。
    • 感谢您的提示,我们在 Linux 平台上,但这值得进一步研究。
    • 我注意到删除错误 - 因为 db[collection_name].remove() 没有查询!所以它实际上需要是: db[collection_name].remove({})
    【解决方案5】:
    db.getCollectionNames().forEach(c=>db[c].drop())
    

    【讨论】:

      【解决方案6】:

      通过编译来自@Robse 和@DanH 的答案(赞!),我得到了以下完全让我满意的解决方案:

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

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

      【讨论】:

      • 这个脚本只清理一个特定的 Mongo 数据库中的所有内容。它会清除此数据库中的所有集合。
      【解决方案7】:

      这里有一些使用 mongo shell 对 mongodb 的有用删除操作

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

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

      删除任何特定集合:db.mycollection.drop()

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

      db.dropDatabase()
      

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          使用

          [databaseName]
          db.Drop+databaseName();
          
          drop collection 
          
          use databaseName 
          db.collectionName.drop();
          

          【讨论】:

            【解决方案10】:

            如果您只想删除一个数据库及其子集合,请使用:

            • use &lt;database name&gt;;
            • 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();
                            }
                         }
                      );
            

            【讨论】:

            • 很好的答案......这可能是用户得到的结果
            【解决方案11】:

            我更喜欢

            db.your_collection.remove({})
            

            结束

            db.your_collection.drop()
            

            如果您的收藏是特殊收藏 即capped collection 或一个字段标记为唯一的集合,删除将清除集合本身,当再次创建集合时,它将是一个普通集合。您将不得不再次定义属性。 所以使用remove()来清除文档,不会移除集合,影响集合的行为。

            【讨论】:

            • 好点。值得一提的是,drop() 几乎是即时的,remove({}) 将您的数据库锁定几分钟或几十分钟(取决于集合大小)。
            【解决方案12】:

            删除数据库的最简单方法说博客:

            > use blog
            switched to db blog
            > db.dropDatabase();
            { "dropped" : "blog", "ok" : 1 }
            

            【讨论】:

              【解决方案13】:

              适用于 Meteor 开发人员。

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

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

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

              3. 然后直接输入db.yourCollectionName.drop();

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

              其他人。

              db.yourCollectionName.drop();

              【讨论】:

                【解决方案14】:
                1. 列出所有可用的数据库 显示数据库
                2. 选择必要的数据库 使用
                3. 删除数据库 db.dropDatabase() //一些额外的命令
                4. 列出数据库中所有可用的集合 显示收藏
                5. 删除规范集合 db.collection.drop()

                希望有帮助

                【讨论】:

                  【解决方案15】:

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

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

                  【讨论】:

                    【解决方案16】:
                    use <dbname>
                    db.dropAllUsers()
                    db.dropAllRoles()
                    db.dropDatabase()
                    

                    MongoDB db.dropDatabase() documentation解释2.6引入的修改:

                    2.6 版更改:此命令不会删除与当前数据库关联的用户。

                    【讨论】:

                      【解决方案17】:

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

                      > 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
                      

                      【讨论】:

                        猜你喜欢
                        • 2019-12-15
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-03-28
                        • 2018-08-30
                        • 1970-01-01
                        • 2011-02-01
                        • 2022-01-13
                        相关资源
                        最近更新 更多