首页 > 解决方案 > Flask+PyMongo 的 JSON 解码器

问题描述

我有使用 MongoDB 的 Flask 应用程序。我在编码 ObjectId、datetime 和 date 对象时遇到了问题,但是用这个https://stackoverflow.com/a/51773611/9472066答案解决了它们 - 自定义编码器有效。但是,我不知道如何为 PyMongo 编写解码器:我如何知道字符串是 ObjectId 还是 datetime 或其他什么?我是否必须在解码器方法中手动检查格式,然后调用适当的构造函数?或者有没有更智能、更自动化的方法?

标签: pythonjsonflaskpymongo

解决方案


我强烈建议您使用本机 python 类型,因为 pymongo 将在创建适当类型方面完成所有繁重的工作。

认为 MongoDB 是一个 JSON 数据库是错误的,而认为必须使用 JSON 才能将数据输入和输出是一个更大的错误。

如果您真的想这样做,请尝试该bson.json_util模块:

import pymongo
import bson.json_util

db = pymongo.MongoClient()["mydatabase"]

db.mycollection.insert_one({'a': 'a'})
json_str = bson.json_util.dumps(db.mycollection.find_one({'a': 'a'}))
json_dict = json.loads(json_str)
json_dict['a'] = 'b'
json_str = json.dumps(json_dict)
db.newcollection.insert_one(bson.json_util.loads(json_str))
print(list(db.newcollection.find({})))

但我更愿意在本地执行此操作:

db.mycollection.insert_one({'a': 'a'})
record = db.mycollection.find_one({'a': 'a'})
record['a'] = 'b'
db.newcollection.insert_one(record)
print(list(db.newcollection.find({})))

推荐阅读