簡體   English   中英

如何將MongoDB查詢轉換為JSON?

[英]How do I turn MongoDB query into a JSON?

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'] = ""

由於像ObjectID之類的東西, json模塊將無法工作。

幸運的是PyMongo提供了json_util ......

...允許[s]將BSON文檔的專門編碼和解碼轉換為Mongo Extended JSON的嚴格模式。 這使您可以將BSON文檔編碼/解碼為JSON,即使它們使用特殊的BSON類型也是如此。

這是一個簡單的示例,使用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)

編寫一個可以處理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)

在Python 3.6上使用motor == 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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM