我的應用程序以JSON格式生成日誌。日誌看起來像這樣:將ISODate字符串轉換爲mongoDB本地ISODate數據類型
{"LogLevel":"error","Datetime":"2013-06-21T11:20:17Z","Module":"DB","Method":"ExecuteSelect","Request":"WS_VALIDATE","Error":"Procedure or function 'WS_VALIDATE' expects parameter '@LOGIN_ID', which was not supplied."}
目前,我推入上述日誌行,因爲它是進入mongoDB。但是mongoDB將Datetime存儲爲一個字符串(這是預期的)。現在我想在這些日誌上運行一些數據處理作業,我寧願將Datetime存儲爲mongoDB的本地ISODate數據類型。
有3種方法我能想到的這樣做:
我)解析每個JSON日誌線和轉換線在應用程序代碼,以ISODate類型,然後將其插入。缺點:我將不得不解析每一行,然後推送到mongoDB,這將是一個有點貴
ii)每個插入後運行查詢將最後插入的文檔的字符串日期時間轉換爲使用ISODate
element.Datetime = ISODate(element.Datetime);
缺點:同樣昂貴的,因爲我會在運行每個刀片 III中的一個額外的查詢)修改我在生成點日誌,以便我不必在應用程序代碼級別做任何分析,或每次插入後運行更新查詢
此外,只是好奇,有沒有一種方法可以配置mongoDB自動將日期時間字符串轉換爲其本機isodate格式?
TIA
編輯: 我使用pymongo用於插入JSON日誌
我的文件看起來是這樣的:
{ 「LogLevel的」: 「錯誤」, 「日期時間」: 「2013-06-21T11:20:17Z」,「模塊」:「DB」,「方法」:「ExecuteSelect」,「請求」:「WS_VALIDATE」,「錯誤」:「過程或函數'WS_VALIDATE'期望參數' @LOGIN_ID',它沒有提供。「}
有數百行像一個mentio以上內容。 這是我如何將它們插入到MongoDB的:
for line in logfile:
collection.insert(json.loads(line))
下面將解決我的問題:
for line in logfile:
data = json.loads(line)
data["Datetime"] = datetime.strptime(data["Datetime"], "%Y-%M-%DTHH:mmZ")
collection.insert(data)
我想要做的就是擺脫日期時間的額外操縱我的什麼我不得不這樣做。希望能夠澄清這個問題。
您可以控制應用程序 - 爲什麼不從ISODate生成日期並從頭開始存儲? –
謝謝@AsyaKamsky。我的應用程序生成日誌並將它們作爲文件存儲在其特定的服務器上。這些日誌被移動到一箇中央日誌存儲服務器,從那裏我把日誌推送到mongoDB。日誌文件在字符串中有ISODate格式的時間,但是當我將日誌推送到mongoDB時,它將時間數據作爲一個字符串。 – texens
通過使用批量插入並將文檔附加到數組中,然後在數組中包含X條目時插入,可以減少插入的數量。 – Ross