我如何可以使用Python改造MongoDB的bsondump成JSON?(How can I us

2019-06-26 21:13发布

所以,我有.bson的从MongoDB中转储一个巨大的数量。 我使用bsondump在命令行上,管道输出作为标准输入到Python。 这从BSON到“JSON”转换成功,但它实际上是一个字符串,看似不合法的JSON。

例如入线看起来是这样的:

{ "_id" : ObjectId( "4d9b642b832a4c4fb2000000" ),
  "acted_at" : Date( 1302014955933 ),
  "created_at" : Date( 1302014955933 ),
  "updated_at" : Date( 1302014955933 ),
  "_platform_id" : 3,
  "guid" : 72106535190265857 }

这我相信是蒙戈扩展JSON 。

当我在这样的行读,做:

json_line = json.dumps(line)

我得到:

"{ \"_id\" : ObjectId( \"4d9b642b832a4c4fb2000000\" ),
\"acted_at\" : Date( 1302014955933 ),
\"created_at\" : Date( 1302014955933 ),
\"updated_at\" : Date( 1302014955933 ),
\"_platform_id\" : 3,
\"guid\" : 72106535190265857 }\n"

这仍然是<type 'str'>

我也曾尝试

json_line = json.dumps(line, default=json_util.default)

(见pymongo json_util - 垃圾邮件检测防止第三连杆)这似乎输出与上述相同的转储。 负载给出了一个错误:

json_line = json.loads(line, object_hook=json_util.object_hook)
ValueError: No JSON object could be decoded

所以,我如何改变天甲JSON字符串成JSON解析的? (最终目标是制表符分隔的数据流到另一个数据库)

Answer 1:

你有什么是在天甲模式蒙戈扩展JSON转储(见这里 )。 一些可能的方法去:

  1. 如果你能倒回,通过MongoDB的REST API使用严格的输出模式。 这应该给你真正的JSON,而不是你现在所拥有的。

  2. 使用bson从http://pypi.python.org/pypi/bson/读你已经有了BSON到Python的数据结构,然后你需要对这些(可能输出JSON)的任何处理。

  3. 使用MongoDB的Python绑定连接到数据库中的数据进入Python的,然后做你需要的任何处理。 (如果需要的话,你可以建立一个本地的MongoDB实例,并导入倾倒文件到这一点。)

  4. 转换自天正模式蒙戈扩展JSON严格的模式。 你可以开发一个单独的滤波器做到这一点(从标准输入读取,具有严格的结构取代天甲结构,输出在标准输出的结果),或者当你处理这些输入你可以做到这一点。

下面是使用Python和正则表达式的例子:

import json, re
from bson import json_util

with open("data.tengenjson", "rb") as f:
    # read the entire input; in a real application,
    # you would want to read a chunk at a time
    bsondata = f.read()

    # convert the TenGen JSON to Strict JSON
    # here, I just convert the ObjectId and Date structures,
    # but it's easy to extend to cover all structures listed at
    # http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON
    jsondata = re.sub(r'ObjectId\s*\(\s*\"(\S+)\"\s*\)',
                      r'{"$oid": "\1"}',
                      bsondata)
    jsondata = re.sub(r'Date\s*\(\s*(\S+)\s*\)',
                      r'{"$date": \1}',
                      jsondata)

    # now we can parse this as JSON, and use MongoDB's object_hook
    # function to get rich Python data structures inside a dictionary
    data = json.loads(jsondata, object_hook=json_util.object_hook)

    # just print the output for demonstration, along with the type
    print(data)
    print(type(data))

    # serialise to JSON and print
    print(json_util.dumps(data))

根据你的目标,其中之一应该是一个合理的起点。



Answer 2:

加载整个BSON文档到蟒存储器是昂贵的。

如果要传输它,而不是加载整个文件和所有做负载,可以试试这个库。

https://github.com/bauman/python-bson-streaming

from bsonstream import KeyValueBSONInput
from sys import argv
for file in argv[1:]:
    f = open(file, 'rb')
    stream = KeyValueBSONInput(fh=f,  fast_string_prematch="somthing") #remove fast string match if not needed
    for id, dict_data in stream:
        if id:
         ...process dict_data...


Answer 3:

您可以将这样的BSON文件的行:

>>> import bson
>>> bs = open('file.bson', 'rb').read()
>>> for valid_dict in bson.decode_all( bs ):
....

每个valid_dict元素将是一个有效的Python字典,你可以转换成JSON。



文章来源: How can I use Python to transform MongoDB's bsondump into JSON?