将mongoengine查询集转换为json文件
我想知道怎么把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)