اذهب إلى المحتوى

السؤال

نشر

لدي استعلام يقوم بإجراء aggregation على المستندات الموجودة ضمن مجموعة. 

وأستطيع الحصول على النتيجة وطباعتها باستخدام print:

print(resultOfQuery)

ولا يوجد أي مشكلة في أي استعلام أقوم بتنفيذه لأنني أحصل على النتيجة وأستطيع طباعتها، لكن إذا حاولت إعادة النتيجة عن طريق return:

return resultOfQuery

يظهر لدي الخطأ التالي:

TypeError: ObjectId('5f4351948e86c20b1d1c0d3c') is not JSON serializable

لماذا يظهر هذا الخطأ فقط في return؟ وماهي الطريقة الصحيحة لإعادة النتائج؟

Recommended Posts

  • 0
نشر

المشكلة هنا تكمن في أن نمط البيانات ObjectId المعرف في mongo غير معرفه عليه عملية التسلسل serialization لذلك عليك تعريف طريقة التحويل الخاصة بك واستخدامها:

from bson import ObjectId
import json

class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        return json.JSONEncoder.default(self, o)

res = json.dumps(DBResultMessage, cls=JSONEncoder)

حيث أن هذه الدالة ستتعامل بشكل خاص مع النمط ObjectId وتحوله لسلسلة نصية قبل ترميزه على هيئة JSON

  • 0
نشر

حل سريع لذلك هو عبر إستخدام دالة ()str كالآتي

ObjectId = str(ObjectId('5f4351948e86c20b1d1c0d3c'))

اما إذا كنت تستخدم Flask فيمكنك إستخدام دالة jsonify

@app.route('/')
def home():
    docs = []
    for doc in db.person.find():
        doc.pop('_id') 
        docs.append(doc)
    return jsonify(docs)

أو يمكنك التحويل من BSOM الى JSON كالآتي

from bson import json_util
import json

@app.route('/')
def index():
    for _ in "collection_name".find():
        return json.dumps(i, indent=4, default=json_util.default)

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...