2010-11-04 59 views
4

我正在編寫一個實用工具,它將工作中的關係數據庫轉換爲複雜的JSON對象並轉儲到按主題分組的文件。然後我想使用mongoimport工具將這些文件導入到MongoDB集合中。MongoImport日期在世紀之前發生

我們的數據包括表示日期之前發生的日期的時間戳,其適當的JSON表示形式爲負數。雖然MongoDB本身將處理這些罰款,但導入工具JSON解析器使用unsigned long long變量並失敗。

如果您使用Mongo的特殊JSON日期表示格式({"key": { "$date": "value_in_ticks" } }),導入工具將在這些文檔上引發錯誤並跳過導入。您還可以使用JavaScript日期符號({"key": new Date(value_in_ticks) }),該日期符號將被成功導入,但會被解析爲創建垃圾日期的無符號值。

特殊日期格式由於assertion checking for reserved words而失敗。此代碼已達到,因爲值的開頭出現負號會導致特殊的日期分析退出並返回到正常的文檔分析。

code to parse JSON dates顯式調用增強庫uint_parser。存在該函數的簽名版本,並且issue on their JIRA tracker已經存在以利用它(我在其上評論過,我會嘗試)。

立即潛入代碼以嘗試更新此代碼進行簽名的缺點,現在是否有替代路線可以加載這些日期?

我想通過cron每個晚上運行幾個月進行測試,所以我寧願它很容易。這些日期存在於許多不同集合的文檔的許多不同部分,因此解決方案應該是一般化的。

+0

雖然我沒有答案,但對於一個寫得很好的問題,請+1。 – UnkwnTech 2010-11-04 15:18:59

回答

0

晚會有點晚,但我剛剛提出反對同樣的問題。

我的解決方法是導入的日期作爲字符串(如「1950年1月1日」),以及腳本中使用Ruby on Rails的與Mongoid轉換:

Dates.each do |d| 
    d.mydate = d.mydate.to_date 
    d.save 
end 

希望你能適應這一切你正在使用的語言/框架。

+0

經過更仔細的檢查,違規日期是過去任意放置的日期,只是將它們從當前報告計算中刪除。我們只是將它們更新爲1970年1月1日發生的。 – 2011-05-09 12:07:31

-2

步驟1:去groups.google.com/group/mongodb-user和發佈問題「mongoimport不支持紀元前的日子」。團隊的反應時間往往非常好。

步驟2:認爲一個普遍接受的格式,如跑步的日期「1964年4月25日13時23分12秒」

這將需要多一點點空間,MongoDB的,因爲你會存儲字符串。但是,對於任何拔出數據的人來說,它應該很容易解釋。

0

這個Python代碼片段適合我。

import time, struct 

def bson_datetime(adatetime): 
    try: 
     ret = int(1000*(time.mktime(adatetime.timetuple()) + 3600)) 
     if ret < 0: 
      ret = struct.unpack('Q', struct.pack('q', ret))[0] 
     return {'$date': ret} 
    except ValueError: 
     return None 

I.e.

import datetime 
print bson_datetime(datetime.datetime(1950, 12, 30, 0, 0)) 

yield {「abc」:{「$ date」:18446743473920751616}}。

相關問題