zoukankan      html  css  js  c++  java
  • mongodb中批量将时间戳转变通用日期格式

    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)
    ab
    cd
    ef
    

    2。mongodb的模糊查询

    mongodb模糊查询參考:http://blog.csdn.net/5iasp/article/details/20714943,须要找出全部时间戳的数据记录,由于时间戳多是以数字开头,近期几年的都是14XXX的,所以正則表達式以14开头搜索。实现方式例如以下:

    mongos> use pos
    switched to db pos
    mongos> 
    db.paymentinfo.find({"paymentTime": {$regex: '14', $options:'i'}}).count();
    mongos> db.paymentinfo.find({"paymentTime": {$regex: '144', $options:'i'}}).count();
    1995
    mongos> 

    查询到有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}});
        }
    })

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


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

    删除查询出来的集合数据

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

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

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

    删除paymentTime=0的数据记录

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

    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) });

    看到这里也不能解决我的问题。所以思路停止了,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) }
        );
    

    上面的样例表明直接用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});
         }
          # 使用遍历数组的方式来操作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});
         }   

    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});
         }   
    -- insert data
    insert into t1 select 1,'a' from db1.t2;
    call db1.proc_get_fints

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

  • 相关阅读:
    Redis-cluster集群【第二篇】:redis持久化
    Redis-cluster集群【第一篇】:redis安装及redis数据类型
    django2.0 官方中文文档地址
    jenkins设置CSRF 协议(CRUMB值设置)
    elasticsearch-dump 迁移es数据 (elasticdump)
    大独裁者最后演讲台词
    面向对象的弊端是什么(转)
    IntelliJ IDEA 破解
    Django 2.0.1 官方文档翻译:接下来读什么(page 14)
    Django 2.0.1 官方文档翻译: 高级教程:如何编写可重用的app (page 13)
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7234663.html
Copyright © 2011-2022 走看看