将mongoengine查询集转换为json文件

1 投票
1 回答
4118 浏览
提问于 2025-04-17 02:41

我想知道怎么把Mongo数据库中的一组文档数据导出到一个.json文件里,使用Python来实现。

我试过用Django的序列化工具,但因为Mongo里的字段访问方式和Django不一样,所以没成功。

for model in models:
    json_serializer.serialize(model.objects.all(), indent=2, stream=output_file_mongo)

我也试着用Python的JSON编码和解码工具,

import json
for model in mongo_models:
    output_file_mongo.write(json.dumps(model.objects.all()))

但是我遇到了一个异常错误。

  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: [<MongoModelA: MongoModelA object>] is not JSON serializable

1 个回答

2

Django的序列化器不知道怎么处理mongoengine对象,所以你很可能需要自己写一个json编码器,把这些对象转换成简单的字典形式:

class MyEncoder(json.JSONEncoder):
    def encode_object(self, obj):
        return { 'id':unicode(obj.id), 'other_property': obj.other_property }

    def default(self, obj):
        if hasattr(obj, '__iter__'):
            return [ self.encode_object(x) for x in obj ]
        else:
            return self.encode_object(obj)

然后像这样调用它:

import json
import MyEncoder

json_string = json.dumps(model.objects.all(), cls=MyEncoder)

撰写回答