前言
时间戳(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.com/mongodb/topic/274/mongodb中批量将时间戳转变通用日期格式