3

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

  • 从文本文件中读取数据
  • 将数据转换为 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
}

我不知道我应该用什么来代替“?” 因此,当我在 python 中使用 bson.json_util.loads 函数时,它可以正确地将文本文件转换为 Json,以后可以将其插入到 mongoDB 中。

这是执行加载和插入的代码:

with open('data.txt') as f:
    data = json_util.loads(f.read())
    db[dbName][colName].update({'_id': id}, data, upsert=True,safe=True)

如果有人可以举例说明文件应该如何格式化,我将不胜感激。(如果您的示例可以包含更复杂的 Bson 类型,例如类型“二进制”或“代码”,那也很好:))

4

3 回答 3

9

Mongo 对日期时间的表示是{"$date": number-of-milliseconds-since-epoch}. 在您的示例中:

{
   "S": "someString",
   "N": 123,
   "F": 12.3,
   "D": {"$date": 1352540684243}
}

D写入 mongo 时将生成一个日期时间字段。

请参阅mongo json 扩展的文档

您还可以轻松地扩展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)
于 2012-11-12T04:53:42.377 回答
0

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

于 2012-11-12T04:10:33.817 回答
0

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

于 2012-11-12T04:21:28.443 回答