bson.json_util提供转换为规范或宽松 JSON 格式的函数。但是,它们都坚持 ObjectId 的相同表示:from PyMongo import MongoClientfrom bson.objectid import ObjectIdfrom bson import json_utilfrom bson.json_util import RELAXED_JSON_OPTIONSfrom bson.json_util import CANONICAL_JSON_OPTIONS, DEFAULT_JSON_OPTIONSdb = MongoClient(URL)['DB_NAME']mongo_query_result = db.collection.find_one({'_id': ObjectId('ID')}, {'_id': 1})# returns {'_id': ObjectId('ID')}print(json_util.dumps(mongo_query_result, json_options=RELAXED_JSON_OPTIONS))print(json_util.dumps(mongo_query_result, json_options=CANONICAL_JSON_OPTIONS))print(json_util.dumps(mongo_query_result, json_options=DEFAULT_JSON_OPTIONS))# Results{"_id": {"$oid": "ID"}}{"_id": {"$oid": "ID"}}{"_id": {"$oid": "ID"}}# Desired Output{"_id": "ID"}问题在于它与我在 prod env 中得到的结果不匹配。我PyMongo只是用来构建测试用例,实际的产品格式是{'_id': "ID", ..etc}我在这里查看了一些文档,以下是调查结果:CANONICAL_JSON_OPTIONS 和 RELAXED_JSON_OPTIONS 都坚持有问题的表示,规范在这里。我似乎无法覆盖它,因为uuid_representation=PYTHON_LEGACY我似乎无法找到解决方法。我是否缺少将PyMongo查询结果转换为:{'_id' : 'ID', ..}# not{'_id' : {'$oid' : 'ID'}, ..}我不想扩展我的代码只是为了处理不同格式的测试用例。
2 回答

富国沪深
TA贡献1790条经验 获得超9个赞
这是我的做法,只使用提供的json
库
json.dumps(list(products.find({})), default=lambda o: str(o))

慕沐林林
TA贡献2016条经验 获得超9个赞
作为一种解决方法,我能够使用re正则表达式完成相同的结果:
import re
def remove_oid(string):
while True:
pattern = re.compile('{\s*"\$oid":\s*(\"[a-z0-9]{1,}\")\s*}')
match = re.search(pattern, string)
if match:
string = string.replace(match.group(0), match.group(1))
else:
return string
string = json_dumps(mongo_query_result)
string = remove_oid(string)
这实质上将 CANONICAL_JSON 替换为规范化的 JSON,并将键值删除为一个值。
尽管这可以完成工作,但它并不理想,因为我JSON将其作为字符串进行操作,并且非常容易出错,而且不适用于Date其他格式。
添加回答
举报
0/150
提交
取消