mongodb中批量将时间戳转变通用日期格式

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

1,官网提供的mongodb遍历脚本:

官方文档地址:https://docs.mongodb.org/manual/tutorial/remove-documents/>var arr = ["ab","cd","ef"]>var show = function(value,index,ar){ print(value) }>arr.forEach(show)abcdef
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2,mongodb的模糊查询

mongodb模糊查询参考:http://blog.csdn.net/5iasp/article/details/20714943,需要找出所有时间戳的数据记录,因为时间戳多是以数字开头,最近几年的都是14XXX的,所以正则表达式以14开头搜索,实现方式如下:

mongos> use posswitched to db posmongos> db.paymentinfo.find({"paymentTime": {$regex: '14', $options:'i'}}).count();mongos> db.paymentinfo.find({"paymentTime": {$regex: '144', $options:'i'}}).count();1995mongos> 
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

查询到有1995条记录,蛮多的,需要处理记录数不少。

建立遍历函数:

db.cms_Content.find({"userId":"444333f107624489bae28140d1970bbc"}).forEach(function(x) {    if(x.title&&x.fileName){        print(x.contentId);db.cms_Content.update({"contentId":x.contentId},{"$set":{"title":x.fileName}});    }})
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

PS:证明不能用,效果一般


3,首先删除一部分txnType为1的胀数据

删除查询出来的集合数据

db.paymentinfo.remove( {"txnType": {$regex: '1', $options:'i'}}, 300 );
  
  
  • 1

删除所以查询出来的记录:

db.paymentinfo.remove( {"txnType": {$regex: '1', $options:'i'}});
  
  
  • 1

删除paymentTime=0的数据记录

db.paymentinfo.remove( { paymentTime : "0" } )
  
  
  • 1

4,遗留问题需要解决

for (var i = 0, len = 3; i < len; i++) {var child=dschilds[i]; var id=child._id; printjson((id)); var paymentTime=child.paymentTime; printjson(paymentTime)}
批量修改校验错误日期数据的期待解决的问题

 db.paymentinfo.update({"_id": ObjectId("55d56fdbe4b0c1f89b5356ae")},{$set:{"paymentTime" : "14400511608049527"}},true); var ds= db.paymentinfo.find({"paymentTime": {$regex: '144', $options:'i'}}); for (var i = 0, len = 1; i < len; i++) {    var child=dschilds[i];     var id=child._id;     printjson(id);    var paymentTime=child.paymentTime;      var datestr=paymentTime      #问题在这里,这个日期是时间戳,比如1440560826340的模式,请问下,在mongodb shell里面如何将时间戳变成字符串'2015-12-15 12:34:16'这样的日期字符串呢?     db.paymentinfo.update({"_id": id},{$set:{"paymentTime" :datestr}},true);     db.paymentinfo.find({"_id": id}); } db.paymentinfo.find({"_id":ObjectId("55dd36dc45ce9e75b91eb340")}).forEach(function (a) { a["paymentTime"] = new Date(parseInt(paymentTime) * 1000).toLocaleString().replace(/:\d{1,2}$/,' '); printjson(a) });
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

看到这里也不能解决我的问题,所以思路停止了,toLocaleString()获得的是GST的日期格式串,不是我需要的yyyy-mm-dd hh:mm:ss结构的日期格式数


5,找到突破口,使用javascript

mongodb官网已经报错提示有说明,mongodb shell里面是可以调用javascript脚本,这么说来,直接在窗口里面写js脚本来实现就ok了,然后准备拿一条数据来验证是否正确,结果成功了,验证脚本如下:
 – 单独一条集合数据中,将时间戳变成日期字符串:

db.paymentinfo.find({"_id":ObjectId("55d56cbbe4b0c1f89b5356a4")}).forEach(function (a) {           #这个函数是在月、日、时分秒的个位数字前面补0操作的        function tran_val(val){            if(parseInt(val)<10){                val="0" +val;            }            return val;        }        # 这里是paymentTime为时间戳        var datenew = new Date(parseInt(paymentTime));         # 获取年月日        var year=datenew.getFullYear();         var month=tran_val(datenew.getMonth()+1);        var date=tran_val(datenew.getDate());         # 获取时分秒        var hour=tran_val(datenew.getHours());        var minute=tran_val(datenew.getMinutes());         var second=tran_val(datenew.getSeconds());          # 组装成标准的日期格式yyyy-mm-dd hh:mm:ss         var datastr=year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;         a["paymentTime"]=datastr        print(paymentTime);         printjson(a) }    );
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

上面的例子表明直接用js脚本可以实现时间戳到日期格式转变,那么下面就开始for循环批量修改:

  db.paymentinfo.update({"_id": ObjectId("55d56fdbe4b0c1f89b5356ae")},{$set:{"paymentTime" : "14400511608049527"}},true);    # 使用遍历数组的方式来操作144开头的时间戳     var ds= db.paymentinfo.find({"paymentTime": {$regex: '144', $options:'i'}});     var dschilds=ds.toArray();     for (var i = 0;i <dschilds.length ; i++) {        var child=dschilds[i];         var id=child._id;         var paymentTime=child.paymentTime;        print(paymentTime);        function tran_val(val){                    if(parseInt(val)<10){                        val="0" +val;                    }                    return val;        }        var datenew = new Date(parseInt(paymentTime));         var year=datenew.getFullYear();             var month=tran_val(datenew.getMonth()+1);        var date=tran_val(datenew.getDate());         var hour=tran_val(datenew.getHours());        var minute=tran_val(datenew.getMinutes());         var second=tran_val(datenew.getSeconds());        var datestr=year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;         # 这里开始进行修改操作        db.paymentinfo.update({"_id": id},{$set:{"paymentTime" :datestr}},true);        db.paymentinfo.find({"_id": id});     }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
      # 使用遍历数组的方式来操作145开头的时间戳     var ds= db.paymentinfo.find({"paymentTime": {$regex: '145', $options:'i'}});     var dschilds=ds.toArray();     for (var i = 0;i <dschilds.length ; i++) {        var child=dschilds[i];         var id=child._id;         var paymentTime=child.paymentTime;        print(paymentTime);        function tran_val(val){                    if(parseInt(val)<10){                        val="0" +val;                    }                    return val;        }        var datenew = new Date(parseInt(paymentTime));         var year=datenew.getFullYear();             var month=tran_val(datenew.getMonth()+1);        var date=tran_val(datenew.getDate());         var hour=tran_val(datenew.getHours());        var minute=tran_val(datenew.getMinutes());         var second=tran_val(datenew.getSeconds());        var datestr=year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;         db.paymentinfo.update({"_id": id},{$set:{"paymentTime" :datestr}},true);        db.paymentinfo.find({"_id": id});     }   
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

6,碰到新的问题,统一日期格式,将斜杠变成横杠

–批量修改日期 斜杠变成横杠

     var ds= db.paymentinfo.find({"paymentTime": {$regex: '/', $options:'i'}});     var dschilds=ds.toArray();     for (var i = 0;i <dschilds.length; i++) {        var child=dschilds[i];         var id=child._id;        var paymentTime=child.paymentTime;        var paymentTime2=paymentTime.replace(/\//g,"-");        db.paymentinfo.update({"_id": id},{$set:{"paymentTime" :paymentTime2}},true);        print(paymentTime);print(paymentTime2);        db.paymentinfo.find({"_id": id});     }   
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
-- insert datainsert into t1 select 1,'a' from db1.t2;call db1.proc_get_fints
  
  
  • 1
  • 2
  • 3

OK,到此圆满解决,特别感谢给我启发的网友 Aeolus@普 ,^_^

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值