2012-12-03 30 views
7

के रूप में मोंगोइंजिन दस्तावेज़ लौटें, यह भी सुनिश्चित नहीं है कि यह वास्तव में सरल है या नहीं, लेकिन मुझे वास्तव में इस विषय पर कुछ भी नहीं मिल रहा है। लेकिन, या तो मेरे फ्लास्क आधारित वेबसाइट के लिए नियमित मोंगोइंजिन लाइब्रेरी, या यहां तक ​​कि फ्लास्क-मोंगोइंजिन का उपयोग करके, क्या एक मोंगोइंजिन दस्तावेज़ को सीधे JSON के रूप में वापस करना संभव होगा?जेएसओएन

धन्यवाद!

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

उत्तर

7

0.8 में वहाँ सहायकों इस बीच में देखना https://github.com/MongoEngine/mongoengine/issues/1

आप सीधे pymongo के json_utils उपयोग करने के लिए कर रहे हैं

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

मीठे। पता है कि पों के माध्यम से मोंगोएन्गिन 0.8 स्थापित करने का कोई तरीका है या नहीं? ऐसा लगता है कि उनके पास केवल 0.7.7 है :( – Chiggins

+0

अभी तक 0.8 अभी भी अस्थिर नहीं है और विकास में – Ross

4

रॉस की और Jellyflower के जब फील्ड प्रोजेक्शन या ऑर्डरिंग का उपयोग किया जाता है तो वर्कअराउंड काम नहीं करते हैं।

अधिक सामान्य वैकल्पिक हल:

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

अद्यतन: to_mongo() विधि उपयोग सुझाव के लिए Lo-Tan के लिए धन्यवाद।

अंततः मैं निम्नलिखित समाधान के साथ आया था:

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) 

यह to_json() विधि का उपयोग करता, ऊपर उल्लिखित issue के जवाब के रूप में जोड़ा।

+0

कॉलिंग to_json() को _mongo() को निष्पादित करता है (जो आपको इच्छित शब्द बनाता है) और फिर इसे क्रमबद्ध करता है, और फिर आप इसे deserialize, जो काफी अक्षम है। मुझे लगता है कि [o.to_mongo()] (https://gist.github.com/dhesson/e7def67f01d1de452920) का उपयोग करने के लिए एक बेहतर तरीका है, क्योंकि यह आपको एक आदेशित शब्दकोश देता है, और फिर आईडी को प्रतिस्थापित करता है str मूल्य के साथ। वैसे भी, कोड के लिए धन्यवाद क्योंकि यह मुझे सही दिशा में ले जाता है! –