Скрытые навыки MongoDB: как переименовать базу данных
предыстория проблемы
Недавно мои коллеги по команде Java задали мне вопрос, то есть они обнаружили, что в Navicat есть функция переименования имени БД для таких баз данных, как mysql, а для mongodb такой функции нет. беспорядок, имя изменить нельзя.Абсолютно невыносимо.
решения для мозгового штурма
Идея, представленная всеми, состоит в том, чтобы достичь этого через copydb, скопировать данные базы данных в названную базу данных, а затем удалить старую базу данных, но в нашей существующей БД много данных, и это слишком много времени, чтобы выполнить операцию copydb, которая показывает, что этот метод использовать нельзя.
Решение, которое поворачивает за угол
Чтобы решить эту проблему, я тщательно проверил официальную документацию Mongodb, Хотя в MongoDB нет команды для renameDatabase, она предоставляет команду renameCollection().официальная документацияЭта команда может не только изменить имя коллекции, но и изменить базу данных. Например, мы выполняем следующую команду:
db.adminCommand({renameCollection: "test_db1.test_collection1", to: "test_db2.test_collection2"})
Приведенная выше команда переименовывает test_collection1 в test_db1 в test_collection2 в test_db2. Во время теста вы обнаружите, что он сначала создаст целевую базу данных, а все коллекции будут иметь временный суффикс, через некоторое время исходная база данных исчезнет. Миграция прошла успешно. Эта команда изменяет только метаданные, накладные расходы невелики, а процесс переименования может быть выполнен быстро.
С помощью этой функции, чтобы переименовать исходную базу данных в целевую базу данных, вам нужно всего лишь просмотреть все коллекции в исходной базе данных, переименовать их в целевую базу данных, а затем реализовать функцию renameDatabase, Мы знаем, что mongodb поддерживает прямое выполнение js-скриптов, так что покажите коды напрямую:
collection_list = db.getSiblingDB("original_db_name").getCollectionNames();
for (let i = 0; i< collection_list.length; i++) {
let original_db_name = "original_db_name" +"." + collection_list[i];
let target_db_name = "target_db_name"+"."+ collection_list[i];
db.adminCommand({renameCollection: original_db_name, to: target_db_name});
}
Суммировать
При возникновении проблем чтение большего количества официальных документов часто приводит к неожиданным сюрпризам.