Нет, нет. См. https://jira.mongodb.org/browse/SERVER-701
К сожалению, это не простая функция, которую мы реализуем из-за того, что метаданные базы данных хранятся в исходном (по умолчанию) модуле хранения. В файлах MMAPv1 пространство имен (например: dbName.collection), которое описывает каждую отдельную коллекцию и индекс, включает имя базы данных, поэтому для переименования набора файлов базы данных необходимо переписать каждую строку пространства имен. Это влияет на:
- .ns файл
- каждый пронумерованный файл для коллекции
- пространство имен для каждого индекса
- внутренние уникальные имена каждой коллекции и индекса
- содержимое системных пространств имен и system.indexes(или их эквивалентов в будущем)
- другие местоположения, которые могут отсутствовать.
Это просто для того, чтобы выполнить переименование одной базы данных в экземпляре автономного mongod. Для наборов реплик вышеуказанное нужно было бы сделать на каждой реплике node, плюс на каждой node каждая отдельная запись oplog, которая ссылается на эту базу данных, должна быть как-то недействительной или перезаписана, а затем, если это осколочный кластер, необходимо добавить эти изменения в каждый осколок, если БД будет оштрафован, а также у конфигурационных серверов есть все метаданные осколков в терминах пространств имен с их полными именами.
В реальной системе не было бы никакого способа сделать это.
Для этого в автономном режиме потребуется переписывать каждый файл базы данных для размещения нового имени, и в этот момент он будет так же медленным, как текущая команда "copydb"...
Вы можете сделать это:
db.copyDatabase("db_to_rename","db_renamed","localhost")
use db_to_rename
db.dropDatabase();
Редакционное примечание: это тот же подход, который использовался в самом вопросе, но оказался полезным для других независимо.
copyDatabase
. Посмотрите Команды MongoDB Copy Database для прояснения ситуации.
Альтернативное решение: вы можете сбросить свой db и восстановить его под другим именем. Поскольку я испытал это намного быстрее, чем 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/
ВНИМАНИЕ: Привет, ребята, будьте осторожны при копировании базы данных, если вы не хотите путать разные коллекции в одной базе данных.
Ниже показано, как переименовать
> show dbs;
testing
games
movies
Для переименования вы используете следующий синтаксис
db.copyDatabase("old db name","new db name")
Пример:
db.copyDatabase('testing','newTesting')
Теперь вы можете безопасно удалить старую базу данных следующим образом
use testing;
db.dropDatabase(); //Here the db **testing** is deleted successfully
Теперь просто подумайте, что произойдет, если вы попытаетесь переименовать новое имя базы данных в существующее имя базы данных.
Пример:
db.copyDatabase('testing','movies');
Таким образом, в этом контексте все коллекции (таблицы) тестирования будут скопированы в базу данных фильмов.
Вышеупомянутый процесс медленный, вы можете использовать метод ниже, но вам нужно переместить коллекцию по коллекции в другой db.
use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
Если вы поместите все свои данные в базу данных администратора (вы не должны этого db.copyDatabase()
), вы заметите, что db.copyDatabase()
не будет работать, поскольку вашему пользователю требуется много привилегий, которые вы, вероятно, не хотите им предоставлять. Вот скрипт для копирования базы данных вручную:
use old_db
db.getCollectionNames().forEach(function(collName) {
db[collName].find().forEach(function(d){
db.getSiblingDB('new_db')[collName].insert(d);
})
});
Хотя Mongodb не предоставляет команду переименования базы данных, она предоставляет команду r ename Collection, которая не только изменяет имя коллекции, но и имя базы данных.
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});
}