好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

前言

时间戳(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包含某个关键字测试'

?

1

2

3

4

cd /opt/soft/mongodb/bin

./mongo --host 192.168.0.1 --port 17017 test

db.test_info.find({ "tname" : {$regex: '测试' , $options: 'i' }})

db.test_info.find({ "tname" : {$regex:/测试.*/i}})

需要找出所有时间戳的数据记录,因为时间戳多是以数字开头,最近几年的都是14XXX的,所以正则表达式以14开头搜索,实现方式如下:

?

1

2

3

4

5

6

7

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条记录,蛮多的,需要处理记录数不少。

建立遍历函数:

?

1

2

3

4

5

6

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的胀数据

删除查询出来的集合数据

?

1

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

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

?

1

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

删除paymentTime=0的数据记录

?

1

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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循环批量修改:

?

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

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

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

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

?

1

2

3

4

5

6

7

8

9

10

11

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

-- insert data

insert into t1 select 1, 'a' from db1.t2;

call db1.proc_get_fints

OK,到此圆满解决

总结

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

原文链接:http://forum.foxera测试数据/mongodb/topic/274/mongodb中批量将时间戳转变通用日期格式

查看更多关于MongoDB批量将时间戳转为通用日期格式示例代码的详细内容...

  阅读:31次