2015-12-29 399 views
0

我在我的MongoDB數據庫中有這種格式的日期。將日期轉換爲MongoDB ISO日期

{ 
     "_id": ObjectId("5682e899f326d45c821d8b9b"), 
     "City": "Atlanta", 
     "Date": "12/5/02", 
     "Temp": 78.5, 
} 

我想將其轉換爲ISO日期,以便我可以在我的數據庫中對日期進行排序。使用PyMongo或JavaScript進行更新命令的最佳方式是什麼?

+0

是否想通過將Date更改爲ISODate來更新文檔? – styvane

+0

您需要閱讀文檔,添加日期對象,然後再保存它們 – Valijon

回答

-1

我想,你應該首先檢索記錄並使用循環來改變所有。然後你應該解析數據來構造一個Date對象來轉換爲mongo日期。

var value = "12/5/02"; 
var parts = value.split("/"); 
var dt = new Date("20"+parts[2], parseInt(parts[1])-1, parts[0]); 

如果您正在使用的NodeJS,檢查this了。

編輯:我假設12 =日,5 =月。

+0

您是否根據提供的示例日期運行了代碼?我不認爲這是你所希望的那樣 – Andy

+0

@安迪你爲什麼不覺得呢? – abeyaz

+0

因爲當我運行它時會顯示錯誤的日期。 – Andy

0

自從我上次使用Mongo後,Mongo已經發生了很大的變化,但據我所知,正如其他地方所建議的那樣,您將不得不依次加載和更新每條記錄。

你有兩個問題。首先是你的日期格式不明確。您給出的示例日期將具有不同的值,具體取決於用於將其解析爲日期的系統的區域設置。在美國,它是(我認爲)12月5日在2002年。在大西洋的一邊,雖然它將解析爲2002年5月12日。娛樂時間。

假設你知道每個日期的intented格式,那麼在節點可以使用moment.js使用於每個日期解析到一個固定的格式例如

let date = moment(document.Date, "D/M/YY"); 

,然後作爲一個ISO日期輸出

document.Date = date.toISOString(); 

,或者如果你是人爲善,做非破壞性

document.ISODate = date.toISOString(); 

雖然現在你有兩個日期後看...

0

您需要遍歷整個結果集,並逐一更新文件,像這樣:如果你想刪除

var f = function(e) { 
    var arr = e['Date'].split("/"); 

    //assuming "Date" field was formatted as "YY/MM/DD" 
    var date_obj = new Date(arr[0], arr[1], arr[2]); 

    db.your_collection.update({_id: e['_id']}, {$set: {date_obj: date_obj}});  
} 


db.your_collection.find().forEach(f) 

您的舊字段,您可以運行以下內容:

db.your_collection.update({}, {$unset: {Date: 1}}, {multi:true}); 

但是,直到您確定您的日期轉換正確後才這樣做。

+0

使用批量操作可以使這種效率更高。 –

+0

@MarkusWMahlberg - 如果每個文檔的更新'date_obj'值不同,Bulk操作將如何工作? –

+0

我的頭頂2.6:'var bulk = db.c.initializeUnorderedBulkOp(); var f = function(e){... var d = ...; bulk.find(查詢).update(upDoc);}; db.c.find(查詢).forEach(F); bulk.execute()'。相應地爲3.0 –