mongoclient how example documentacion docs create python json mongodb bson

how - pymongo docs python



¿Cómo puedo usar Python para transformar bsondump de MongoDB en JSON? (3)

Lo que tienes es un volcado en Mongo Extended JSON en modo TenGen (ver aquí ). Algunas formas posibles de ir:

  1. Si puede volcar nuevamente, use el modo de salida Estricto a través de la API REST de MongoDB. Eso debería darte JSON real en lugar de lo que tienes ahora.

  2. Use bson de http://pypi.python.org/pypi/bson/ para leer el BSON que ya tiene en las estructuras de datos de Python y luego realice el procesamiento que necesite en esos (posiblemente en JSON).

  3. Use los enlaces de Python de MongoDB para conectarse a la base de datos para obtener los datos en Python, y luego haga el procesamiento que necesite. (Si es necesario, puede configurar una instancia local de MongoDB e importar sus archivos volcados a eso).

  4. Convierta el JSON extendido de Mongo del modo TenGen al modo estricto. Podría desarrollar un filtro separado para hacerlo (leer desde la entrada estándar, reemplazar las estructuras TenGen con estructuras estrictas y generar el resultado en la salida estándar) o puede hacerlo mientras procesa la entrada.

Aquí hay un ejemplo usando Python y expresiones 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))

Dependiendo de su objetivo, uno de estos debe ser un punto de partida razonable.

Así que tengo una enorme cantidad de .bson de un volcado de MongoDB. Estoy usando bsondump en la línea de comandos, canalizando la salida como estándar a Python. Esto se convierte exitosamente de BSON a ''JSON'' pero en realidad es una cadena, y aparentemente no es JSON legal.

Por ejemplo, una línea entrante se ve así:

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

Lo que creo que es Mongo Extended JSON .

Cuando leo en esa línea y hago:

json_line = json.dumps(line)

Yo obtengo:

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

Que sigue siendo <type ''str''> .

Tambien lo he intentado

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

(vea pymongo json_util - la detección de spam previene un tercer enlace) que parece producir lo mismo que los volcados de arriba. cargas da un error:

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

Entonces, ¿cómo puedo transformar la cadena de TenGen JSON en JSON analizable? (el objetivo final es transmitir datos separados por tabuladores a otra base de datos)


Puedes convertir las líneas del archivo bson así:

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

Cada elemento valid_dict será un dict de python válido que puedes convertir a json.


cargar un documento completo de bson en la memoria de python es costoso.

Si desea transmitirlo en lugar de cargar todo el archivo y cargarlo todo, puede probar esta biblioteca.

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