版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1434550
今天遇到一个很尴尬的应用场景,因为新架构之前,我们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);
})
脚本介绍:
具体步骤:
我这边使用的是NoSQL Manager for MongoDB工具进行MongoDB数据管理的,新架构之前的数据如下所示:
新架构之后的数据:
在yfy_score_record右键打来Shell脚本,然后输入我们的脚本命令,如下所示:
总结:
脚本其实很简单,最主要是对线上的数据进行修改都有一定的风险,所以在修改数据之前一定要先进行备份,但是在脚本运行期间新产生的数据就会丢失。未来保证脚本的可靠性,我们一定要在测试环境多测试几次,然后再到生产运行。好了今天的内容就介绍到这边了,谢谢大家的阅读~