mongodb修改欄位資料型別
今天遇到一個很尷尬的應用場景,因為新架構之前,我們mongodb的yfy_score_record表中DATE_TIME欄位的型別是string型別,後來上了新架構之後DATE_TIME欄位變成DateTime型別了,然後統計某一個月內資料的時候就出現問題了,因為string型別的資料查詢方式和DateTime型別查詢方式是完全不一樣的兩種查詢。基於這種情況,我們只能將線上的資料型別進行修改了,將string型別的資料全部修改為DateTime型別。
技術選型:
解決這種情況有兩種方法,一種是通過Java來將資料修改過來,二是通過mongodb自己的指令碼來修改。我們來分析一下這兩種方法的優缺點:
Java方式:程式碼侵入式強,需要寫業務之外的程式碼,會留下一堆無用的資訊,但是採用Java的方式可控性會比較高、自由性強。
指令碼方式:對程式碼0侵入,不需在應用中寫任何程式碼,不會留下任何資訊,但是可控性不高,對mongodb指令碼能力要求比較高。
解決方法:
對比上面的兩種方法,最後我們決定採用指令碼的方式資料型別修改,因為這種方式時間週期最短,程式碼量最少,也不需要修改應用程式碼。我們只需要在mongodb命令介面輸入下面的指令碼命令就可以了,程式碼如下所示:
db.yfy_score_record.find({DATE_TIME:{$type:"string"}}).forEach(function(doc) {
doc.DATE_TIME=new Date(doc.DATE_TIME);
db.yfy_score_record.save(doc);
})
指令碼介紹:
- yfy_score_record是表名稱
- {DATE_TIME:{$type:"string"}}表示DATE_TIME欄位必須是string型別
- doc.DATE_TIME=new Date(doc.DATE_TIME);修改DATE_TIME欄位型別,變為Date型別
- db.yfy_score_record.save(doc);儲存修改後的欄位資訊
具體步驟:
我這邊使用的是NoSQL Manager for MongoDB工具進行MongoDB資料管理的,新架構之前的資料如下所示:
新架構之後的資料:
在yfy_score_record右鍵打來Shell指令碼,然後輸入我們的指令碼命令,如下所示:
總結:
指令碼其實很簡單,最主要是對線上的資料進行修改都有一定的風險,所以在修改資料之前一定要先進行備份,但是在指令碼執行期間新產生的資料就會丟失。未來保證指令碼的可靠性,我們一定要在測試環境多測試幾次,然後再到生產執行。好了今天的內容就介紹到這邊了,謝謝大家的閱讀~
要更多幹貨、技術猛料的孩子,快點拿起手機掃碼關注我,我在這裡等你哦~