2012-12-03 4 views
7

Nicht sicher, ob dies wirklich einfach ist oder nicht, aber ich kann nicht wirklich etwas zu dem Thema finden. Aber, entweder mit der regulären MongoEngine-Bibliothek oder sogar mit Flask-MongoEngine für meine Flask-basierte Website, wäre es möglich, ein MongoEngine-Dokument als JSON-Direktausgabe zurückzugeben?Rückgabe MongoEngine Dokumente als JSON

Danke!

Antwort

7

In 0.8 gibt es Helfer https://github.com/MongoEngine/mongoengine/issues/1

in der Zwischenzeit sehen müssen Sie direkt pymongo der json_utils verwenden:

from bson import json_util 
json_util.dumps(MyDoc._collection_obj.find(MyDoc.objects()._query)) 
+1

Süß. Wissen Sie, ob es eine Möglichkeit gibt, Mongoengine 0.8 über Pip zu installieren? Es scheint, sie haben nur bis zu 0.7.7 :( – Chiggins

+0

Noch nicht 0.8 ist immer noch instabil und in Entwicklung – Ross

2

Die richtige Abhilfe sollte wohl sein:

from bson import json_util 
objects = MyDoc.objects() 
json_util.dumps(objects._collection_obj.find(objects._query)) 
4

Ross und Jellyflower des Problemumgehungen funktionieren nicht, wenn Feldprojektion oder Reihenfolge verwandt wird.

Weitere allgemeine Abhilfe:

from bson import json_util 
json = json_util.dumps(query._cursor) 
0

aktualisieren: Dank Lo-Tan für to_mongo() Methode Nutzungs Vorschlag.

Schließlich kam ich mit der folgenden Lösung:

from json import JSONEncoder 

from mongoengine.base import BaseDocument 


class MongoEncoder(JSONEncoder): 
    def default(self, o): 
     if isinstance(o, BaseDocument): 
      data = o.to_mongo() 
      # might not be present if EmbeddedDocument 
      o_id = data.pop('_id', None) 
      if o_id: 
       data['id'] = str(o_id['$oid']) 
      data.pop('_cls', None) 
      return data 
     else: 
      return JSONEncoder.default(self, o) 


# consider `obj` to be MongoEngine object 
json_data = json.dumps(obj, cls=MongoEncoder) 

Es verwendet to_json() Verfahren, wie die Antwort auf die zuvor erwähnte issue hinzugefügt.

+0

Aufruf von to_json() führt to_mongo() (was das gewünschte Wörterbuch erstellt) und dann serialisiert es, und dann deserialisieren Sie es, Das ist ziemlich ineffizient. Ich denke, ein besserer Ansatz besteht darin, einfach [o.to_mongo()] (https://gist.github.com/dhesson/e7def67f01d1de452920) zu verwenden, da es Ihnen ein geordnetes Wörterbuch gibt und dann die ID ersetzt mit dem str Wert. Wie auch immer, danke für den Code, da er mich in die richtige Richtung führte! –