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脚本,然后输入我们的脚本命令,如下所示:

总结:

脚本其实很简单,最主要是对线上的数据进行修改都有一定的风险,所以在修改数据之前一定要先进行备份,但是在脚本运行期间新产生的数据就会丢失。未来保证脚本的可靠性,我们一定要在测试环境多测试几次,然后再到生产运行。好了今天的内容就介绍到这边了,谢谢大家的阅读~

要更多干货、技术猛料的孩子,快点拿起手机扫码关注我,我在这里等你哦~

                                                       

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页