MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come posso usare Python per trasformare bsondump di MongoDB in JSON?

Quello che hai è un dump in Mongo Extended JSON in modalità TenGen (vedi qui). Alcuni possibili modi per andare:

  1. Se è possibile eseguire nuovamente il dump, utilizzare la modalità di output Strict tramite l'API REST di MongoDB. Questo dovrebbe darti un JSON reale invece di quello che hai ora.

  2. Usa bson da http://pypi.python.org/pypi/bson/ per leggere il BSON che hai già nelle strutture dati Python e quindi eseguire l'elaborazione necessaria su quelle (possibilmente l'output di JSON).

  3. Usa i collegamenti Python MongoDB per connetterti al database per ottenere i dati in Python, quindi esegui l'elaborazione di cui hai bisogno. (Se necessario, puoi configurare un'istanza MongoDB locale e importarvi i file scaricati.)

  4. Converti il ​​Mongo Extended JSON dalla modalità TenGen alla modalità Strict. Potresti sviluppare un filtro separato per farlo (leggere da stdin, sostituire le strutture TenGen con le strutture Strict e restituire il risultato su stdout) oppure potresti farlo mentre elabori l'input.

Ecco un esempio che utilizza Python e le espressioni regolari:

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))

A seconda del tuo obiettivo, uno di questi dovrebbe essere un punto di partenza ragionevole.