2012-12-03 22 views
7

Nie jestem pewien, czy to naprawdę proste, czy nie, ale tak naprawdę nie mogę znaleźć niczego na ten temat. Ale czy przy użyciu zwykłej biblioteki MongoEngine, czy nawet Flask-MongoEngine dla mojej strony opartej na Flask, będzie możliwe zwrócenie dokumentu MongoEngine jako prostego JSON?Powróć MongoEngine Documents jako JSON

Dzięki!

Odpowiedz

7

w 0,8 istnieją pomocników zobaczyć https://github.com/MongoEngine/mongoengine/issues/1

w międzyczasie trzeba korzystać bezpośrednio json_utils pymongo za:

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

Słodki. Wiesz, czy istnieje sposób na zainstalowanie mongoengine 0.8 through pip? Wygląda na to, że mają tylko 0.7.7 :( – Chiggins

+0

Jeszcze 0.8 jest wciąż niestabilny i w fazie rozwoju – Ross

2

Prawidłowe obejście prawdopodobnie powinien być:

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

Ross i Jellyflower użytkownika obejścia nie działają, gdy używana jest projekcja pola lub zamówienie.

Więcej ogóle Obejście:

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

Aktualizacja: dzięki Lo-Tan dla to_mongo() Sposób użytkowania sugestii.

Ostatecznie wpadł następującego roztworu:

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) 

wykorzystuje to_json() metody dodaje się jako odpowiedź na wyżej issue.

+0

Wywołanie to_json() wykonuje to_mongo() (które tworzy słownik, który chcesz), a następnie serializuje go, a następnie deserializujesz go, co jest dość nieefektywne.Myślę, że lepszym podejściem jest po prostu użyć [o.to_mongo()] (https://gist.github.com/dhesson/e7def67f01d1de452920), ponieważ daje on uporządkowany słownik, a następnie zastąp identyfikator z wartością str. W każdym razie, dzięki za kod, który doprowadził mnie we właściwym kierunku! –