1. 程式人生 > >mongodb修改欄位資料型別

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指令碼,然後輸入我們的指令碼命令,如下所示:

總結:

指令碼其實很簡單,最主要是對線上的資料進行修改都有一定的風險,所以在修改資料之前一定要先進行備份,但是在指令碼執行期間新產生的資料就會丟失。未來保證指令碼的可靠性,我們一定要在測試環境多測試幾次,然後再到生產執行。好了今天的內容就介紹到這邊了,謝謝大家的閱讀~

要更多幹貨、技術猛料的孩子,快點拿起手機掃碼關注我,我在這裡等你哦~