MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como posso usar o Python para transformar o bsondump do MongoDB em JSON?


O que você tem é um dump no Mongo Extended JSON no modo TenGen (veja aqui). Alguns caminhos possíveis:

  1. Se você puder fazer dump novamente, use o modo de saída Strict por meio da API REST do MongoDB. Isso deve fornecer JSON real em vez do que você tem agora.

  2. Use bson de http://pypi.python.org/pypi/bson/ para ler o BSON que você já possui em estruturas de dados Python e, em seguida, fazer o processamento necessário neles (possivelmente gerando JSON).

  3. Use as ligações do MongoDB Python para se conectar ao banco de dados para obter os dados no Python e, em seguida, faça o processamento necessário. (Se necessário, você pode configurar uma instância local do MongoDB e importar seus arquivos despejados para ela.)

  4. Converta o Mongo Extended JSON do modo TenGen para o modo Strict. Você pode desenvolver um filtro separado para fazer isso (ler de stdin, substituir estruturas TenGen por estruturas Strict e gerar o resultado em stdout) ou pode fazê-lo enquanto processa a entrada.

Aqui está um exemplo usando Python e expressões regulares:
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))

Dependendo do seu objetivo, um deles deve ser um ponto de partida razoável.