“的格式应该是什么?”;日期“;在文本文件中读取为Json,然后使用Python插入MongoDB?

“的格式应该是什么?”;日期“;在文本文件中读取为Json,然后使用Python插入MongoDB?,python,json,mongodb,bson,Python,Json,Mongodb,Bson,我需要在代码中执行以下操作: 从文本文件中读取数据 将数据转换为Json 将数据插入MongoDB 以下是文本文件内容的外观示例: { "S": "someString" <- Type String when inerted in mongodb "N": 123 <- Type Int32 "F": 12.3 <- Type Double "D": ? <- Need to be Ty

我需要在代码中执行以下操作:

  • 从文本文件中读取数据
  • 将数据转换为Json
  • 将数据插入MongoDB
以下是文本文件内容的外观示例:

{
   "S": "someString" <- Type String when inerted in mongodb
   "N": 123          <- Type Int32
   "F": 12.3         <- Type Double
   "D": ?            <- Need to be Type DateTime when inerted in mongodb
}

如果有人能举例说明文件的格式,我将不胜感激。(如果您的示例可以包含更复杂的Bson类型,比如类型“binary”或“code”,那也很好:)

JSON对日期一无所知,所以您可以决定序列化和反序列化的标准格式。它将作为字符串存储在MongoDB中,因此在Python代码中调用strftime和strptime时,请确保使用相同格式的字符串。

为什么不使用时间戳呢。它们非常容易使用,除了在实际的程序代码中之外,不需要真正的特殊处理,或者可以很容易地作为整数单独使用。我处理过格式字符串,但确实没有一种好的方法来确保它们在任何地方都是相同的,因此我开始尽可能使用时间戳。

Mongo对日期时间的表示是
{“$date”:自历元起的毫秒数}
。在您的示例中:

{
   "S": "someString",
   "N": 123,
   "F": 12.3,
   "D": {"$date": 1352540684243}
}
D
将在写入mongo时生成日期时间字段

您还可以轻松地扩展
json_util
来编写自己的扩展,例如ISO格式的日期时间:

import json, dateutil.parser, bson.json_util

a = """{
    "mydate": {"$isodate": "2012-11-01T20:19:55.782Z"}
}"""

def my_hook(dct):
    if '$isodate' in dct:
        return dateutil.parser.parse(dct['$isodate'])
    return bson.json_util.object_hook(dct)

obj = json.loads(a, object_hook=my_hook)

基于此文档()我应该能够将BSON文档编码/解码为JSON,即使它们使用JSON_util使用特殊的BSON类型,我只是还没有弄清楚如何进行。对不起,我误解了这个问题。现在我已经看了bsonspec.org,我认为肖恩对时间戳有了正确的想法。这是一个很好的观点,肖恩。实际上,如果你看一下bsonspec.org,他们的datetime数据类型只是一个代表标准utc时间戳的64位int。谢谢你的建议。如果我刚开始的话,我会采用使用时间戳的想法,但在我的例子中,我将在先前存在的mongo集合中插入数据,该集合中已经有类型为“DateTime”的数据,并且该集合正在映射到需要DateTime的C类的C代码中使用!所以这是一个有点完整,我坚持与格式!谢谢,在我阅读你的答案之前,我实际上阅读了该文档并试用了它,它确实有效,但我主要是在寻找像$datetime这样的东西,它将采用ISO标准字符串,如{“$datetime”:“2012-11-11Z”},我对没有这样的东西感到非常失望!查看日期的epochis之后有毫秒数的文本文件并不是很方便@伊丹:是的,没有这样的东西,但它可以很容易地添加:查看更新。哇,谢谢:)你比我领先一步!实际上,我正在考虑将一个自定义编码器类传递给
load(fp,cls=None,object\u hook=None,parse\u float=None,parse\u int=None,parse\u constant=None,object\u pairs\u hook=None,**kw)
我试图找出我该怎么做!
import json, dateutil.parser, bson.json_util

a = """{
    "mydate": {"$isodate": "2012-11-01T20:19:55.782Z"}
}"""

def my_hook(dct):
    if '$isodate' in dct:
        return dateutil.parser.parse(dct['$isodate'])
    return bson.json_util.object_hook(dct)

obj = json.loads(a, object_hook=my_hook)