代码之家  ›  专栏  ›  技术社区  ›  Jake Wharton

MongoImport日期早于纪元

  •  4
  • Jake Wharton  · 技术社区  · 14 年前

    我正在编写一个实用程序,它将工作中的关系数据库转换为复杂的JSON对象,并转储到按主题分组的文件。然后我想使用 mongoimport 工具。

    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 显式调用boost库 uint_parser . 存在此函数的签名版本和 issue on their JIRA tracker

    除了立即跳入代码中尝试将其更新为签名之外,现在是否有其他路径可供我加载这些日期?

    3 回复  |  直到 7 年前
        1
  •  0
  •   gjb    13 年前

    聚会有点晚了,但我也遇到了同样的问题。

    我的解决方法是将日期导入为字符串(例如“1950-01-01”),并使用Ruby on Rails和Mongoid编写转换脚本:

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

        2
  •  0
  •   innohead    11 年前

    这个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
    

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

    产生{“abc”:{“$date”:18446743473920751616}。

        3
  •  -2
  •   Gates VP    14 年前

    步骤1 :转到groups.google.com/group/mongodb-user并发布问题 . 小组的反应时间往往很好。

    :以普遍接受的格式考虑运行日期,如“1964-04-25 13:23:12”

    在MongoDB中会占用更多的空间,因为您要存储字符串。然而,对于任何拿出数据的人来说,这应该很容易理解。