MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment puis-je utiliser Python pour transformer le bsondump de MongoDB en JSON ?

Ce que vous avez est un dump dans Mongo Extended JSON en mode TenGen (voir ici). Quelques pistes possibles :

  1. Si vous pouvez à nouveau vider, utilisez le mode de sortie Strict via l'API REST MongoDB. Cela devrait vous donner du vrai JSON au lieu de ce que vous avez maintenant.

  2. Utilisez bson depuis http://pypi.python.org/pypi/bson/ pour lire le BSON que vous avez déjà dans les structures de données Python, puis effectuez le traitement dont vous avez besoin sur celles-ci (éventuellement en produisant du JSON).

  3. Utilisez les liaisons MongoDB Python pour vous connecter à la base de données afin d'obtenir les données dans Python, puis effectuez le traitement dont vous avez besoin. (Si nécessaire, vous pouvez configurer une instance MongoDB locale et y importer vos fichiers de vidage.)

  4. Convertissez le Mongo Extended JSON du mode TenGen au mode Strict. Vous pouvez développer un filtre séparé pour le faire (lire à partir de stdin, remplacer les structures TenGen par des structures Strict et afficher le résultat sur stdout) ou vous pouvez le faire pendant que vous traitez l'entrée.

Voici un exemple utilisant Python et des expressions régulières :

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

En fonction de votre objectif, l'un d'entre eux devrait constituer un point de départ raisonnable.