如何将MongoDB查询转换为JSON?

36 投票
4 回答
49734 浏览
提问于 2025-04-16 08:19
for p in db.collection.find({"test_set":"abc"}):
    posts.append(p)
thejson = json.dumps({'results':posts})
return  HttpResponse(thejson, mimetype="application/javascript")

在我的Django/Python代码中,我无法从MongoDB查询中返回JSON,因为出现了“ObjectID”的问题。错误提示说“ObjectID”无法被序列化。

我该怎么做呢?一种比较简单的方法是通过循环来处理:

for p in posts:
    p['_id'] = ""

4 个回答

9

写一个自定义的序列化器来处理ObjectIds其实很简单。Django里已经有一个可以处理小数和日期的序列化器,所以你可以在这个基础上进行扩展:

from django.core.serializers.json import DjangoJSONEncoder
from bson import objectid

class MongoAwareEncoder(DjangoJSONEncoder):
    """JSON encoder class that adds support for Mongo objectids."""
    def default(self, o):
        if isinstance(o, objectid.ObjectId):
            return str(o)
        else:
            return super(MongoAwareEncoder, self).default(o)

现在你只需要告诉json使用你自己写的序列化器就可以了:

thejson = json.dumps({'results':posts}, cls=MongoAwareEncoder)
27

这里有一个简单的示例,使用的是 pymongo 2.2.1 版本。

import os
import sys
import json
import pymongo
from bson import BSON
from bson import json_util

if __name__ == '__main__':
  try:
    connection = pymongo.Connection('mongodb://localhost:27017')
    database = connection['mongotest']
  except:
    print('Error: Unable to Connect')
    connection = None

  if connection is not None:
    database["test"].insert({'name': 'foo'})
    doc = database["test"].find_one({'name': 'foo'})
    return json.dumps(doc, sort_keys=True, indent=4, default=json_util.default)
31

json模块无法正常工作,主要是因为像ObjectID这样的特殊情况。

幸运的是,PyMongo提供了一个叫做json_util的工具,它...

...可以专门处理BSON文档的编码和解码,转换成Mongo扩展的JSON严格模式。这意味着即使你的BSON文档使用了特殊的BSON类型,你也可以将它们编码或解码为JSON格式。

撰写回答