python - 使用 PyMongo 将 MongoDB find() 序列化为非匿名 JSON 数组

标签 python mongodb mongodb-query pymongo

我的 Python 代码查询 MongoDB 并取回以下对象的数组:

{
    u'attribute': u'value',
    u'_id': ObjectId('534776c66e5987041f6154bd')
}

我想要实现的是返回以下 JSON:

{
    'mycollectionkey' : [
        {
            'attribute':'value',
            '_id': ObjectId('534776c66e5987041f6154bd')
        },
        ...and so on.
     ]
}

但是,当我这样做时:

docs = mongodb.find(...query...)
docs_json = bson.json_util.dumps(docs)
return flask.jsonify(success=True,mycollectionkey=docs_json)

我得到:{ 'mycollectionkey' : "*giant string representation of data*"} 其中所说的巨型字符串显然不再是 JSON。

最佳答案

这里的问题是,在将响应传递到另一个数据结构(现在作为字符串)之前,您已经将响应字符串化为 JSON,以便将其作为 JSON 返回。所以你基本上是在进行双重编码,“字符串”被编码。

所以只需传入一次数据:

docs = mongodb.find(...query...)
return bson.json_util.dumps({ 'success': True, 'mycollectionKey': docs })

所以在像这样的小集合上:

{ "_id" : ObjectId("5343aeb5efbdb94c3647c8df"), "field" : "BBB" }
{ "_id" : ObjectId("5343aebbefbdb94c3647c8e0"), "field" : "aaa" }
{ "_id" : ObjectId("5343aebfefbdb94c3647c8e1"), "field" : "AAA" }

得到这样的结果:

{   
    "mycollectionKey": [
        {"field": "BBB", "_id": {"$oid": "5343aeb5efbdb94c3647c8df"}}, 
        {"field": "aaa", "_id": {"$oid": "5343aebbefbdb94c3647c8e0"}}, 
        {"field": "AAA", "_id": {"$oid": "5343aebfefbdb94c3647c8e1"}}
    ], 
    "success": true
}

如果您真的担心这两个键的顺序,那么您可以使用 bson“转储”转到一个字符串,然后使用标准的 json 解码器进行解码,以获得反序列化的 Mongo 对象的 native 字典,然后进一步放入您订购的字典中。

但实际上您的客户不应该关心键的顺序,而只需要那些根元素。

关于python - 使用 PyMongo 将 MongoDB find() 序列化为非匿名 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23024356/

相关文章:

ruby-on-rails - 蒙古人 : deal with concurrent find_or_create_by

mongodb - 使用golang mongo-driver,MongoDB更新操作不起作用

mongodb - 为什么 mongo 不允许在另一个 $facet 中使用 $facet 阶段?

mongodb - 匹配数组中的多个值

java - MongoDB——Java |如何管理连接

Python和翻转姓氏,名字的顺序

Python Apyori 按提升排序

MongoDB 在数组中查找元素(子文档)

.net - 在循环中从 .NET 调用 Python 太慢了

Pythonic/djangonic 以秒为单位处理用户超时的方式(如果需要的话,也可以以分钟为单位)