2017-06-02 90 views
0

我喜歡在我的MongoDB下面的示例數據(採集:data_extraction_test):無法從BSON類型的字符串轉換成日期

{ 
    "_id" : ObjectId("4f16fc97d1e2d32371003e27"), 
    "date" : "14 Nov 2000 08:22:00 -0800" 
} 

{ 
    "_id" : ObjectId("4f16fc97d1e2d32371003e28"), 
    "date" : "14 Nov 2000 07:37:00 -0800" 
} 

{ 
    "_id" : ObjectId("4f16fc97d1e2d32371003e29"), 
    "date" : "14 Nov 2000 07:25:00 -0800" 
} 

當運行JavaScript代碼(提取物在下面給出)以下錯誤出現:無法從BSON類型字符串轉換爲日期

let cursor = col.aggregate([ 
         { 
          $project:{ 
           _id: "$_id", 
           year: {$year: new Date("13 Nov 2000 01:41:00 -0800 (PST)")}, 
           // month: new Date(new String("$date")), 
           month: { $month: "$date" }, 
          } 
         }, 
         { 
          $out: "dan" 
         } 
        ]).toArray((err, items)=>{ 
         assert.equal(null, err); 
         console.log("daniel",items); 
         resolve(true); 
         db.close(); 
        }); 

如何將字符串轉換爲ISODate?

+0

喜的是,在你的數據庫文件的實際表現?你是如何將這些日期插入到數據庫中的? –

+0

嗨,這是本集合中文檔的實際表示。我之前執行過這個函數:db.messages.aggregate([{$ project:{date:{$ substr:[「$ headers.Date」,5,26]}}},{$ out:「date_extraction_test」} ]) –

+0

有關如何修復數據的詳細信息,請參見[在mongodb中轉換字符串](https://stackoverflow.com/questions/10942931/converting-string-to-date-in-mongodb) –

回答

0

問題是您正試圖將RFC日期格式轉換爲字符串對象。並且該查詢正在嘗試轉換假定它的Date對象。

我把你的數據庫中的日期,換成ISO 8601格式。

"14 Nov 2000 08:22:00 -0800" => ISODate("2000-11-14T16:22:00.000Z") 

"14 Nov 2000 07:37:00 -0800" => ISODate("2000-11-14T15:37:00Z") 

"14 Nov 2000 07:25:00 -0800" => ISODate("2000-11-14T15:25:00Z") 

之後聚合查詢工作。

請注意根據doc。 日期存儲爲一個64位整數,表示自Unix紀元(1970年1月1日)以來的毫秒數。

將日期存儲爲日期對象而不是字符串可能會更好。你是否有理由將它們存儲爲字符串?

更新 從用戶建議的鏈接Neil Lunn。 您可以使用以下腳本將該屬性轉換爲ISO日期。

(請你的數據庫的備份。櫃面東西不走右)

//change test to your collection name 
db.test.find({}).forEach(function (doc) { 
    doc.date = new Date(doc.date); 
    db.test.save(doc); 
}); 
+0

感謝您的回答。你如何用ISO 8601格式取代它們?你是否手動編輯過這些內容? 我有很多數據,不能手動編輯它... 日期被存儲爲我的mongoDB中的字符串,因爲原始數據集中的日期被格式化爲字符串。 –

+0

嗨,請檢查更新部分 –

+0

非常感謝你,這是有幫助的。 –

相關問題