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});
}
複製程式碼
總結
遇到問題,多閱讀官方文件往往會得到意想不到的驚喜。