MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann ich Python verwenden, um bsondump von MongoDB in JSON umzuwandeln?

Was Sie haben, ist ein Dump in Mongo Extended JSON im TenGen-Modus (siehe hier). Einige mögliche Vorgehensweisen:

  1. Wenn Sie erneut einen Dump erstellen können, verwenden Sie den Strict-Ausgabemodus über die MongoDB-REST-API. Das sollte Ihnen echtes JSON geben, anstatt das, was Sie jetzt haben.

  2. Verwenden Sie bson von http://pypi.python.org/pypi/bson/, um den BSON, den Sie bereits haben, in Python-Datenstrukturen einzulesen und dann die erforderliche Verarbeitung an diesen durchzuführen (möglicherweise Ausgabe von JSON).

  3. Verwenden Sie die MongoDB-Python-Bindungen, um eine Verbindung zur Datenbank herzustellen, um die Daten in Python zu übertragen, und führen Sie dann die erforderliche Verarbeitung durch. (Bei Bedarf können Sie eine lokale MongoDB-Instanz einrichten und Ihre gesicherten Dateien in diese importieren.)

  4. Konvertieren Sie Mongo Extended JSON vom TenGen-Modus in den Strict-Modus. Sie könnten dafür einen separaten Filter entwickeln (aus stdin lesen, TenGen-Strukturen durch Strict-Strukturen ersetzen und das Ergebnis auf stdout ausgeben) oder Sie könnten dies tun, während Sie die Eingabe verarbeiten.

Hier ist ein Beispiel mit Python und regulären Ausdrücken:

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

Abhängig von Ihrem Ziel sollte eines davon ein vernünftiger Ausgangspunkt sein.