【发布时间】:2011-03-22 22:30:33
【问题描述】:
我正在 MongoDB 上进行开发。出于完全非恶意的目的,我有时想删除数据库中的所有内容——也就是说,删除每个集合,以及可能存在的任何其他内容,然后从头开始。有没有一行代码可以让我这样做?同时提供 MongoDB 控制台方法和 MongoDB Ruby 驱动程序方法的奖励积分。
【问题讨论】:
标签: mongodb
我正在 MongoDB 上进行开发。出于完全非恶意的目的,我有时想删除数据库中的所有内容——也就是说,删除每个集合,以及可能存在的任何其他内容,然后从头开始。有没有一行代码可以让我这样做?同时提供 MongoDB 控制台方法和 MongoDB Ruby 驱动程序方法的奖励积分。
【问题讨论】:
标签: mongodb
在 mongo 外壳中:
use [database];
db.dropDatabase();
并删除用户:
db.dropAllUsers();
【讨论】:
db.dropAllUsers();
另外,从命令行:
mongo DATABASE_NAME --eval "db.dropDatabase();"
【讨论】:
当我需要重置所有集合但又不想丢失任何数据库用户时,我遇到了同样的问题。如果您想保存数据库的用户配置,请使用以下代码行:
use <whichever database>
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db[c].drop(); })
此代码将遍历一个数据库中的所有集合名称,并删除那些不以“system”开头的集合。
【讨论】:
remove 代替drop 更可靠。 remove 选项似乎保持对您正在清除的集合的字段的约束。当我们使用drop 方法时,我们的一个字段上的unique 约束在下降后没有得到遵守。
else 分支(到if (c.indexOf("system.") == -1)),它执行remove 而不是drop。这样,如果您不再使用它们,您就不会留下空集合
db[c],使用db.getCollection(c),避免errors when collection names are digits。
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
我遵循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 上都可以工作。
db.getCollectionNames().forEach(c=>db[c].drop())
【讨论】:
通过编译来自@Robse 和@DanH 的答案(赞!),我得到了以下完全让我满意的解决方案:
db.getCollectionNames().forEach( function(collection_name) {
if (collection_name.indexOf("system.") == -1)
db[collection_name].drop();
else
db[collection_name].remove({});
});
它通过删除用户集合并清空系统集合来清理数据库。
【讨论】:
这里有一些使用 mongo shell 对 mongodb 的有用删除操作
要删除集合中的特定文档:db.mycollection.remove( {name:"stack"} )
要删除集合中的所有文档:db.mycollection.remove()
删除任何特定集合:db.mycollection.drop()
删除数据库:
首先通过use mydb 命令访问该数据库,然后
db.dropDatabase()
【讨论】:
如果您需要一次删除所有内容:(一次删除所有数据库)
mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
【讨论】:
使用
[databaseName]
db.Drop+databaseName();
drop collection
use databaseName
db.collectionName.drop();
【讨论】:
如果您只想删除一个数据库及其子集合,请使用:
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();
}
}
);
【讨论】:
我更喜欢
db.your_collection.remove({})
结束
db.your_collection.drop()
如果您的收藏是特殊收藏
即capped collection 或一个字段标记为唯一的集合,删除将清除集合本身,当再次创建集合时,它将是一个普通集合。您将不得不再次定义属性。
所以使用remove()来清除文档,不会移除集合,影响集合的行为。
【讨论】:
drop() 几乎是即时的,remove({}) 将您的数据库锁定几分钟或几十分钟(取决于集合大小)。
删除数据库的最简单方法说博客:
> use blog
switched to db blog
> db.dropDatabase();
{ "dropped" : "blog", "ok" : 1 }
【讨论】:
适用于 Meteor 开发人员。
在localhost:3000 中运行您的应用时打开第二个终端窗口。
在您项目的文件夹中运行meteor mongo。
coolName = new Mongo.Collection('yourCollectionName');
然后直接输入db.yourCollectionName.drop();
您将自动在本地服务器中看到更改。
其他人。
db.yourCollectionName.drop();
【讨论】:
希望有帮助
【讨论】:
要删除所有数据库,请使用:
for i in $(mongo --quiet --host $HOSTNAME --eval "db.getMongo().getDBNames()" | tr "," " ");
do mongo $i --host $HOSTNAME --eval "db.dropDatabase()";
done
【讨论】:
use <dbname>
db.dropAllUsers()
db.dropAllRoles()
db.dropDatabase()
MongoDB db.dropDatabase() documentation解释2.6引入的修改:
2.6 版更改:此命令不会删除与当前数据库关联的用户。
【讨论】:
在 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
【讨论】: