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

Hvordan kan jeg bruge Python til at transformere MongoDB's bsondump til JSON?

Det, du har, er et dump i Mongo Extended JSON i TenGen-tilstand (se her). Nogle mulige veje at gå:

  1. Hvis du kan dumpe igen, skal du bruge Strict output-tilstand gennem MongoDB REST API. Det burde give dig ægte JSON i stedet for det, du har nu.

  2. Brug bson fra http://pypi.python.org/pypi/bson/ for at læse den BSON, du allerede har, ind i Python-datastrukturer og derefter udføre den behandling, du har brug for på disse (udsender muligvis JSON).

  3. Brug MongoDB Python-bindingerne til at oprette forbindelse til databasen for at få dataene ind i Python, og foretag derefter den behandling, du har brug for. (Hvis det er nødvendigt, kan du konfigurere en lokal MongoDB-instans og importere dine dumpede filer til den.)

  4. Konverter Mongo Extended JSON fra TenGen-tilstand til Strict-tilstand. Du kan udvikle et separat filter til at gøre det (læs fra stdin, udskift TenGen-strukturer med Strict structures, og output resultatet på stdout), eller du kan gøre det, mens du behandler inputtet.

Her er et eksempel, der bruger Python og regulære udtryk:

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

Afhængigt af dit mål bør en af ​​disse være et rimeligt udgangspunkt.



  1. Sådan returneres række af strenge med mongodb-aggregation

  2. Implementerer jeg serialisering og deserialisering af NodesJS + Passport + RedisStore?

  3. Hvordan kan du fjerne alle dokumenter fra en samling med Mongoose?

  4. Mongoose find() returnerer ikke resultat