h0945466 发表于 2017-12-16 08:29:08

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; var>  
批量改动校验错误日期数据的期待解决的问题
  

  

  

  

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;

  var>  printjson(id);
  var paymentTime=child.paymentTime;
  var datestr=paymentTime
  #问题在这里,这个日期是时间戳,比方1440560826340的模式。请问下。在mongodb shell里面怎样将时间戳变成字符串'2015-12-15 12:34:16'这种日期字符串呢?

  db.paymentinfo.update({"_id":>
  db.paymentinfo.find({"_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;

  var>  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":>
  db.paymentinfo.find({"_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;

  var>  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":>
  db.paymentinfo.find({"_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;

  var>  var paymentTime=child.paymentTime;
  var paymentTime2=paymentTime.replace(/\//g,"-");

  db.paymentinfo.update({"_id":>  print(paymentTime);print(paymentTime2);

  db.paymentinfo.find({"_id":>  }   
  

  

  

  

-- insert data  
insert into t1 select 1,'a' from db1.t2;
  
call db1.proc_get_fints
  

  

  OK,到此圆满解决,特别感谢给我启示的网友 Aeolus@普 ,^_^
页: [1]
查看完整版本: mongodb中批量将时间戳转变通用日期格式