有沒有辦法使用MongoDB的外殼採用自定義格式字符串轉換爲日期MongoDB中轉換字符串到日期
我試圖轉換「21 /月/ 2012:16:35:33 -0400」至今,
有沒有辦法通過DateFormatter
什麼的到 Date.parse(...)
或ISODate(....)
方法?
有沒有辦法使用MongoDB的外殼採用自定義格式字符串轉換爲日期MongoDB中轉換字符串到日期
我試圖轉換「21 /月/ 2012:16:35:33 -0400」至今,
有沒有辦法通過DateFormatter
什麼的到 Date.parse(...)
或ISODate(....)
方法?
您可以在由Ravi Khakhkhar提供的第二個鏈接中使用JavaScript,或者您將不得不執行一些字符串操作來轉換您的原始字符串(因爲原始格式中的某些特殊字符未被識別爲有效的定界符),但是一旦你做到這一點,你可以用「新」
training:PRIMARY> Date()
Fri Jun 08 2012 13:53:03 GMT+0100 (IST)
training:PRIMARY> new Date()
ISODate("2012-06-08T12:53:06.831Z")
training:PRIMARY> var start = new Date("21/May/2012:16:35:33 -0400") => doesn't work
training:PRIMARY> start
ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")
training:PRIMARY> var start = new Date("21 May 2012:16:35:33 -0400") => doesn't work
training:PRIMARY> start
ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")
training:PRIMARY> var start = new Date("21 May 2012 16:35:33 -0400") => works
training:PRIMARY> start
ISODate("2012-05-21T20:35:33Z")
下面是一些鏈接,你可以蒙戈外殼內發現有用的(有關數據的修改) -
http://cookbook.mongodb.org/patterns/date_range/
http://www.mongodb.org/display/DOCS/Dates
http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell
謝謝。我用外部客戶端重新加載數據 - http://stackoverflow.com/questions/6154594/how-do-you-store-a-string-in-mongodb-as-a-date-type-using-ruby?rq= 1 – user883257
很酷,謝謝你讓我知道。如果你覺得我的答案是有幫助的,你能否也請你放心嗎? –
在我的情況我有以下解決方案成功從字符串從ClockTime收集轉換領域ClockInTime爲Date類型:
db.ClockTime.find().forEach(function(doc) {
doc.ClockInTime=new Date(doc.ClockInTime);
db.ClockTime.save(doc);
})
我使用了''新的ISODate(...)'作爲我的日期字符串,並且工作完美。感謝您的建議。 – sumitkm
'新日期(...)'搞砸了我的日期。 '新的ISODate(...)'工作。謝謝@sumitkm – Tur1ng
我不知道爲什麼,但這種方法需要比var cursor = db.restaurant_review.find()等更長的時間來執行。 (cursor.hasNext()){ var doc = cursor.next(); db.restaurant_review.update({_ id:doc._id},{$ set:{date:new ISODate(doc.date)}}) }; – qwerty123
我在MongoDB的一些字符串必須將它們重新格式化爲MongoDB中正確且有效的dateTime字段。
,這裏是我的特殊日期格式代碼:「2014-03-12T09:14:19.5303017 + 01:00」
,但你可以採取easyly這個想法,寫自己的正則表達式來解析日期格式:
// format: "2014-03-12T09:14:19.5303017+01:00"
var myregexp = /(....)-(..)-(..)T(..):(..):(..)\.(.+)([\+-])(..)/;
db.Product.find().forEach(function(doc) {
var matches = myregexp.exec(doc.metadata.insertTime);
if myregexp.test(doc.metadata.insertTime)) {
var offset = matches[9] * (matches[8] == "+" ? 1 : -1);
var hours = matches[4]-(-offset)+1
var date = new Date(matches[1], matches[2]-1, matches[3],hours, matches[5], matches[6], matches[7]/10000.0)
db.Product.update({_id : doc._id}, {$set : {"metadata.insertTime" : date}})
print("succsessfully updated");
} else {
print("not updated");
}
})
做轉換,就需要使用forEach()
方法 或光標方法,通過兩種手動循環由find()
方法返回遊標next()
訪問文檔。 Withing環路,場轉換爲ISODate對象,然後使用$set
操作員更新的字段,如下面的例子,其中字段被稱爲created_at
,目前持有以字符串格式的日期:
var cursor = db.collection.find({"created_at": {"$exists": true, "$type": 2 }});
while (cursor.hasNext()) {
var doc = cursor.next();
db.collection.update(
{"_id" : doc._id},
{"$set" : {"created_at" : new ISODate(doc.created_at)}}
)
};
爲了提高性能,特別是在處理大型集合時,請利用批量更新使用,因爲您將批量發送操作到服務器1000,這樣可以提供更好的性能,因爲您不會將每個請求發送到服務器,每1000個請求中只有一次。
以下演示了這種方法,第一個示例使用MongoDB版本>= 2.6 and < 3.2
中提供的Bulk API。它通過改變created_at
字段日期字段更新集合中的所有 文件:
var bulk = db.collection.initializeUnorderedBulkOp(),
counter = 0;
db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
var newDate = new ISODate(doc.created_at);
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "created_at": newDate}
});
counter++;
if (counter % 1000 == 0) {
bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Clean up remaining operations in queue
if (counter % 1000 != 0) { bulk.execute(); }
下一個例子適用於新的MongoDB版本3.2
提供一種具有自deprecated the Bulk API和使用API的新集bulkWrite()
:
var bulkOps = [],
cursor = db.collection.find({"created_at": {"$exists": true, "$type": 2 }});
cursor.forEach(function (doc) {
var newDate = new ISODate(doc.created_at);
bulkOps.push(
{
"updateOne": {
"filter": { "_id": doc._id } ,
"update": { "$set": { "created_at": newDate } }
}
}
);
if (bulkOps.length === 500) {
db.collection.bulkWrite(bulkOps);
bulkOps = [];
}
});
if (bulkOps.length > 0) db.collection.bulkWrite(bulkOps);
如何使用像momentjs庫通過寫這樣的腳本:
[install_moment.js]
function get_moment(){
// shim to get UMD module to load as CommonJS
var module = {exports:{}};
/*
copy your favorite UMD module (i.e. moment.js) here
*/
return module.exports
}
//load the module generator into the stored procedures:
db.system.js.save({
_id:"get_moment",
value: get_moment,
});
然後在命令行加載腳本像這樣:
> mongo install_moment.js
最後,在你的下一個蒙戈會議,使用它像這樣:
// LOAD STORED PROCEDURES
db.loadServerScripts();
// GET THE MOMENT MODULE
var moment = get_moment();
// parse a date-time string
var a = moment("23 Feb 1997 at 3:23 pm","DD MMM YYYY [at] hh:mm a");
// reformat the string as you wish:
a.format("[The] DDD['th day of] YYYY"): //"The 54'th day of 1997"
的http:// developwithstyle。 com/articles/2010/07/09/handling-dates-in-mongodb /,不完全是你想要的,但你仍然可以看看 –
http://stackoverflow.com/questions/2900674/how-doi-i-從文本到日期類型轉換爲MongoDB中的屬性,也可以看看這個 –