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模糊查詢參考:,需要找出所有時間戳記的資料記錄,因為時間戳記多是以數字開頭,最近幾年的都是14XXX的,所以Regex以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});
}
OK,到此圓滿解決,特別感謝給我啟發的網友 Aeolus@普 ,^_^
更多MongoDB相關教程見以下內容:
CentOS 編譯安裝 MongoDB與mongoDB的php擴充
CentOS 6 使用 yum 安裝MongoDB及伺服器端配置
Ubuntu 13.04下安裝MongoDB2.4.3
MongoDB入門必讀(概念與實戰並重)
Ubunu 14.04下MongoDB的安裝指南
《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
Nagios監控MongoDB分區叢集服務實戰
基於CentOS 6.5作業系統搭建MongoDB服務
MongoDB 的詳細介紹:請點這裡
MongoDB 的:請點這裡
本文永久更新連結地址: