возвращает данные mongodb как JSON с флягой [дубликат]

Посмотрите на этот вопрос. Также может оказаться полезной информация о константах в руководстве по PHP.

8
задан Chiggins 3 December 2012 в 18:38
поделиться

4 ответа

В 0.8 есть помощники, см. https://github.com/MongoEngine/mongoengine/issues/1

, тем временем вы должны напрямую использовать json_utils pymongo:

from bson import json_util
json_util.dumps(MyDoc._collection_obj.find(MyDoc.objects()._query))
7
ответ дан Ross 20 August 2018 в 17:16
поделиться
  • 1
    Милая. Знаете, есть ли способ установить mongoengine 0,8 через pip? Кажется, у них только до 0.7.7 :( – Chiggins 4 December 2012 в 08:01
  • 2
    Еще не 0,8 по-прежнему нестабилен и в разработке – Ross 4 December 2012 в 10:48

Обновление: благодаря Lo-Tan для предложения использования метода to_mongo().

В конце концов я придумал следующее решение:

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(), добавленный как ответ на вышеупомянутую проблему .

1
ответ дан Community 20 August 2018 в 17:16
поделиться
  • 1
    Вызов to_json () выполняет to_mongo () (который создает нужный вам словарь), а затем сериализует его, а затем десериализует его, что довольно неэффективно. Я думаю, что лучший подход - просто использовать o.to_mongo () , поскольку он дает упорядоченный словарь, а затем заменяет идентификатор значением str. В любом случае, спасибо за код, поскольку он ведет меня в правильном направлении! – Lo-Tan 11 November 2015 в 17:33

Обходные пути Ross и Jellyflower не работают, когда используется проекция поля или упорядочение.

Более общее обходное решение:

from bson import json_util
json = json_util.dumps(query._cursor)
4
ответ дан henadzit 20 August 2018 в 17:16
поделиться

Возможно, правильное обходное решение должно быть:

from bson import json_util
objects = MyDoc.objects()
json_util.dumps(objects._collection_obj.find(objects._query))
2
ответ дан Jellyflower 20 August 2018 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: