問題產生的背景
最近Java組的同事向我請教了一個問題,就是他們發現Navicat中對mysql之類的數據庫都有重命名DB名字的功能,但是針對mongodb竟然沒有這個功能,作為強迫癥的開發者,不能改名,絕對不能忍。
頭腦風暴的解決方案
大家提供的想法是通過copydb來實現,將數據庫的數據拷貝到命名好的數據庫中,然后刪除老的數據庫,但是我們現有的DB里數據非常多,執行copydb操作太耗時,顯示該方法不可取。
峰回路轉的解決方案
為了解決這個問題,仔細查了一下Mongodb的官方文檔,
雖然MongoDB沒有renameDatabase的命令,但提供了renameCollection()這個命令,詳情參考[官方文檔](https://docs.mongodb.com/manual/reference/method/db.collection.renameCollection/index.html)
這個命令并不是僅僅能修改collection的名字,同時也可以修改database。例如我們執行如下命令:
```JavaScript
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:
```JavaScript
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});
}
```
總結
遇到問題,多閱讀官方文檔往往會得到意想不到的驚喜。