Скрытые навыки MongoDB: как переименовать базу данных

MongoDB

Скрытые навыки 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});
}

Суммировать

При возникновении проблем чтение большего количества официальных документов часто приводит к неожиданным сюрпризам.