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

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

問題產生的背景

最近Java組的同事向我請教了一個問題,就是他們發現Navicat中對mysql之類的數據庫都有重命名DB名字的功能,但是針對mongodb竟然沒有這個功能,作爲強迫症的開發者,不能改名,絕對不能忍。
##頭腦風暴的解決方案
大家提供的想法是通過copydb來實現,將數據庫的數據拷貝到命名好的數據庫中,然後刪除老的數據庫,但是我們現有的DB裏數據非常多,執行copydb操作太耗時,顯示該方法不可取。

峯迴路轉的解決方案

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

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

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

有了這個功能,要實現源數據庫重命名爲目標數據庫,只需要遍歷源數據庫下所有的集合,重命名到目標數據庫下,就實現了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});
}

總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章