MongoImport日期在大纪元之前发生

时间:2010-11-04 15:15:50

标签: mongodb database

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

我们的数据包括表示在纪元之前发生的日期的时间戳,其中适当的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显式调用了boost库uint_parser。这个函数有一个签名版本,并且已经存在issue on their JIRA tracker来使用它(我评论过我会尝试)。

如果没有立即深入了解代码以尝试更新此代码,那么我现在可以采用另一种方法来加载这些日期吗?

我想通过cron每晚运行几个月进行测试,所以我希望它非常简单。这些日期存在于许多不同集合中的许多不同文档部分中,因此应该对解决方案进行概括。

3 个答案:

答案 0 :(得分:0)

派对有点晚了,但我刚刚遇到同样的问题。

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

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

希望您可以根据自己使用的语言/框架进行调整。

答案 1 :(得分: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

即。

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

收益率{“abc”:{“$ date”:18446743473920751616}}。

答案 2 :(得分:-2)

第1步:转到groups.google.com/group/mongodb-user并发布问题“mongoimport不支持纪元之前的日期”。群体的响应时间往往非常好。

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

MongoDB需要更多的空间,因为你将存储字符串。但是,对于任何拔出数据的人来说,它应该很容易解释。