如何将 MongoDB 查询转换为 JSON?

Posted

技术标签:

【中文标题】如何将 MongoDB 查询转换为 JSON?【英文标题】:How do I turn MongoDB query into a JSON? 【发布时间】:2011-05-23 05:29:52 【问题描述】:
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 代码中,由于“ObjectID”,我无法从 mongo 查询返回 JSON。错误提示“ObjectID”不可序列化。

我该怎么办? 一个hacky的方法是循环:

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

【问题讨论】:

【参考方案1】:

json 模块由于 ObjectID 等原因无法工作。

幸运的是,PyMongo 提供了 json_util...

... 允许[s] 进行专门的编码和 将 BSON 文档解码为 Mongo 扩展 JSON 的严格模式。这让 您将 BSON 文档编码/解码为 JSON 即使他们使用特殊的 BSON 类型。

【讨论】:

api.mongodb.org/python/1.9%2B/installation.html & api.mongodb.org/python/1.9%2B/tutorial.html & >>> 导入pymongo 此链接已损坏。【参考方案2】:

这是一个简单的示例,使用 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)

【讨论】:

json.dumps(doc, sort_keys=True, indent=4, default=json_util.default) 也解决了我的问题! 使用json_util.dumps(doc)有什么区别? 您也应该导入 json 以使此代码正常工作,对吧?【参考方案3】:

编写处理 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)

【讨论】:

需要import bson 才能正常工作(只是提到它是因为我是新手,我花了很长时间才弄清楚)【参考方案4】:

在 Python 3.6 上使用更简单的东西对我有用 电机==1.1 pymongo==3.4.0

from bson.json_util import dumps, loads

for mongo_doc in await cursor.to_list(length=10):
    # mongo_doc is a <class 'dict'> returned from the async mongo driver, in this acse motor / pymongo.
    # result of executing a simple find() query.

    json_string = dumps(mongo_doc)
    # serialize the <class 'dict'> into a <class 'str'> 

    back_to_dict = loads(json_string)
    # to unserialize, thus return the string back to a <class 'dict'> with the original 'ObjectID' type.

【讨论】:

以上是关于如何将 MongoDB 查询转换为 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

使用SQL将字符串列转换为mongodb中的日期时间

TypeError:将循环结构转换为 mongodb/mongoose 的 JSON

如何将 MongoDB 文档转换为 JSON 对象

如何使用 Python 将 MongoDB 的 bsondump 转换为 JSON?

如何将 SQLite 查询转换为 MongoDB 查询

如何将此 sql 查询转换为 mongodb?