在我的MongoDB数据库名称中有一个错别字,我正在寻找重命名数据库。
我可以像这样复制和删除…
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
是否有重命名数据库的命令?
在我的MongoDB数据库名称中有一个错别字,我正在寻找重命名数据库。
我可以像这样复制和删除…
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
是否有重命名数据库的命令?
当前回答
注意:希望在最新版本中有所改变。 不能在MongoDB 4.0 mongod实例之间复制数据 FCV值)和MongoDB 3.4和更早的mongod实例。 https://docs.mongodb.com/v4.0/reference/method/db.copyDatabase/
警告:嘿,伙计们,在复制数据库时要小心,如果你不想在一个数据库下搞砸不同的集合。
下面展示了如何重命名
> show dbs;
testing
games
movies
要重命名,请使用以下语法
db.copyDatabase("old db name","new db name")
例子:
db.copyDatabase('testing','newTesting')
现在,您可以通过以下方式安全地删除旧的db
use testing;
db.dropDatabase(); //Here the db **testing** is deleted successfully
现在,如果尝试用现有数据库名称重命名新数据库名称,会发生什么情况
例子:
db.copyDatabase('testing','movies');
因此,在这种情况下,所有的测试集合(表)将被复制到电影数据库。
其他回答
是的,这一切看起来都很混乱,其他答案似乎不适合我——大概是因为对工具进行了更多的更改——或者因为我使用的是旧版本。我点击上面的https://stackoverflow.com/a/63372970/1892584,直到它为我工作
我把我的答案包括在内,这样我下次就可以参考了。
我用它来转储一个存档:
mongodb——archive——db=mongodb+srv://$HOST/$OLD_DB > backup . zip
这将恢复到一个新的db:
mongorestore——nsInclude = " OLD_DB美元。*”——nsFrom = ' OLD_DB美元。*’——nsTo = ' NEW_DB美元。*' mongodb+srv://$HOST/$NEW_DB——archive=backup . //
注意nsInclude, nsFrom和nsTo参数。
这是我的mongorestore和mongodump版本
mongodump --version
mongodump version: 100.6.0
git version: 1d46e6e7021f2f5668763dba624e34bb39208cb0
Go version: go1.17.10
os: darwin
arch: amd64
compiler: gc
mongorestore --version
mongorestore version: 100.6.0
git version: 1d46e6e7021f2f5668763dba624e34bb39208cb0
Go version: go1.17.10
os: darwin
arch: amd64
compiler: gc
谁知道这是否适用于不同的版本。
我试过了。
db.copyDatabase('DB_toBeRenamed','Db_newName','host')
然后才知道它已经被mongo社区弃用了,尽管它创建了备份或重命名了DB。
WARNING: db.copyDatabase is deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation
{
"note" : "Support for the copydb command has been deprecated. See
http://dochub.mongodb.org/core/copydb-clone-deprecation",
"ok" : 1
}
所以不相信上面的方法,我不得不采取转储本地使用下面的命令
mongodump --host --db DB_TobeRenamed --out E://FileName/
连接到Db。
use DB_TobeRenamed
然后
db.dropDatabase()
然后使用命令恢复数据库。
mongorestore -host hostName -d Db_NewName E://FileName/
在将所有数据放入管理数据库的情况下(您不应该这样做),您将注意到db.copyDatabase()将不起作用,因为您的用户需要许多特权,而您可能不想给予它。下面是一个手动复制数据库的脚本:
use old_db
db.getCollectionNames().forEach(function(collName) {
db[collName].find().forEach(function(d){
db.getSiblingDB('new_db')[collName].insert(d);
})
});
替代解决方案:您可以转储您的数据库,并恢复到不同的名称。根据我的经验,它比db.copyDatabase()快得多。
$ mongodump -d old_db_name -o mongodump/
$ mongorestore -d new_db_name mongodump/old_db_name
http://docs.mongodb.org/manual/tutorial/backup-with-mongodump/
这是目前官方推荐的数据库重命名方法,因为copyDatabase在MongoDB 4.2中被删除了:
"copydb"命令已弃用,请使用以下两个命令: mongodb(用于备份数据) Mongorestore(将数据从mongodb恢复到一个新的命名空间)
尽管Mongodb没有提供rename Database命令,但它提供了rename Collection命令,该命令不仅修改了集合名称,还修改了数据库名称。
{ renameCollection: "<source_namespace>", to: "<target_namespace>", dropTarget: <true|false> writeConcern: <document> }
db.adminCommand({renameCollection: "db1.test1", to: "db2.test2"})
此命令只修改元数据,成本非常小,只需要遍历db1下的所有集合,重命名为db2即可实现重命名数据库名称。 你可以在这个Js脚本中完成
var source = "source";
var dest = "dest";
var colls = db.getSiblingDB(source).getCollectionNames();
for (var i = 0; i < colls.length; i++) {
var from = source + "." + colls[i];
var to = dest + "." + colls[i];
db.adminCommand({renameCollection: from, to: to});
}
请谨慎使用该命令
renameCollection具有不同的性能影响,具体取决于目标名称空间。 如果目标数据库与源数据库相同,则 renameCollection只是更改名称空间。这是一个快速的 操作。 如果目标数据库与源数据库不同, renameCollection将源集合中的所有文档复制到 目标集合。根据集合的大小,这个 可能需要更长的时间才能完成。