2012-06-08 144 views
15

有沒有辦法使用MongoDB的外殼採用自定義格式字符串轉換爲日期MongoDB中轉換字符串到日期

我試圖轉換「21 /月/ 2012:16:35:33 -0400」至今,

有沒有辦法通過DateFormatter什麼的到 Date.parse(...)ISODate(....)方法?

+0

的http:// developwithstyle。 com/articles/2010/07/09/handling-dates-in-mongodb /,不完全是你想要的,但你仍然可以看看 –

+0

http://stackoverflow.com/questions/2900674/how-doi-i-從文本到日期類型轉換爲MongoDB中的屬性,也可以看看這個 –

回答

4

您可以在由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

+1

謝謝。我用外部客戶端重新加載數據 - http://stackoverflow.com/questions/6154594/how-do-you-store-a-string-in-mongodb-as-a-date-type-using-ruby?rq= 1 – user883257

+1

很酷,謝謝你讓我知道。如果你覺得我的答案是有幫助的,你能否也請你放心嗎? –

27

在我的情況我有以下解決方案成功從字符串從ClockTime收集轉換領域ClockInTime爲Date類型

db.ClockTime.find().forEach(function(doc) { 
    doc.ClockInTime=new Date(doc.ClockInTime); 
    db.ClockTime.save(doc); 
    }) 
+5

我使用了''新的ISODate(...)'作爲我的日期字符串,並且工作完美。感謝您的建議。 – sumitkm

+0

'新日期(...)'搞砸了我的日期。 '新的ISODate(...)'工作。謝謝@sumitkm – Tur1ng

+1

我不知道爲什麼,但這種方法需要比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

3

我在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"); 
    } 
}) 
8

做轉換,就需要使用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); 
0

如何使用像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"