MongoDB隱藏技能:如何重命名數據庫

MongoDB隱藏技能:如何重命名數據庫

問題產生的背景

最近Java組的同事向我請教了一個問題,就是他們發現Navicat中對mysql之類的數據庫都有重命名DB名字的功能,可是針對mongodb居然沒有這個功能,做爲強迫症的開發者,不能更名,絕對不能忍。html

頭腦風暴的解決方案

你們提供的想法是經過copydb來實現,將數據庫的數據拷貝到命名好的數據庫中,而後刪除老的數據庫,可是咱們現有的DB裏數據很是多,執行copydb操做太耗時,顯示該方法不可取。mysql

峯迴路轉的解決方案

爲了解決這個問題,仔細查了一下Mongodb的官方文檔, 雖然MongoDB沒有renameDatabase的命令,但提供了renameCollection()這個命令,詳情參考官方文檔 這個命令並非僅僅能修改collection的名字,同時也能夠修改database。例如咱們執行以下命令:sql

db.adminCommand({renameCollection: "test_db1.test_collection1", to: "test_db2.test_collection2"})
複製代碼

上述命令實現了將test_db1下的test_collection1,重命名爲test_db2下的test_collection2。測試過程當中你會發現他會首先建立一個目標數據庫,並且全部的collection都會出現一個temp的後綴,過一小會兒後,源數據庫就消失了。遷移就成功了。這個命令只修改元數據,開銷很小,重命名過程很快就能夠完成了。mongodb

有了這個功能,要實現源數據庫重命名爲目標數據庫,只須要遍歷源數據庫下全部的集合,重命名到目標數據庫下,就實現了renameDatabase的功能,咱們知道mongodb是支持直接執行js腳本的,所以直接show you codes:數據庫

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});
}
複製代碼

總結

遇到問題,多閱讀官方文檔每每會獲得意想不到的驚喜。測試

相關文章
相關標籤/搜索