侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

MongoDB批量将时间戳转为通用日期格式示例代码

数据库  /  管理员 发布于 5年前   412

前言

时间戳(timestamp),通常是一个字符序列,唯一地标识某一刻的时间。本文将详细介绍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模糊查询方法示例:

模糊查询:tname包含某个关键字测试'

cd /opt/soft/mongodb/bin./mongo --host 192.168.0.1 --port 17017 testdb.test_info.find({"tname": {$regex: '测试', $options:'i'}}) db.test_info.find({"tname": {$regex:/测试.*/i}}) 

需要找出所有时间戳的数据记录,因为时间戳多是以数字开头,最近几年的都是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> 

查询到有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了,然后准备拿一条数据来验证是否正确,结果成功了,验证脚本如下:  C 单独一条集合数据中,将时间戳变成日期字符串:

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,碰到新的问题,统一日期格式,将斜杠变成横杠

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

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

OK,到此圆满解决

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对AIDI的支持。


  • 上一条:
    MongoDB磁盘IO问题的3种解决方法
    下一条:
    db.serverStatus()命名执行时报无权限问题的解决方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客