pymongo find()查询中如何直接将ObjectId转为字符串解决JSON序列化报错
解决方法
方案1:使用聚合查询在数据库层面直接转换_id(符合查询环节处理需求)
pymongo原生find()方法不支持直接修改字段返回类型,你可以用MongoDB聚合管道的$toString操作符在查询阶段就完成_id的类型转换,代码示例:
pipeline = [ # 对应原find方法的query查询条件 {"$match": query}, # 对应原find方法的projection投影配置,额外新增_id转字符串的逻辑 {"$project": { **projection, "_id": {"$toString": "$_id"} }} ] data = list(self.mongo['customer'].aggregate(pipeline))
该方案直接在数据库查询环节完成类型转换,返回的结果集中_id已经是字符串格式,不会触发后续JSON序列化报错。
方案2:查询后即时遍历转换
如果你不想调整原查询逻辑,也可以在拿到find返回结果后直接遍历修改字段类型,代码更简洁:
# 先拿到原始查询结果 raw_data = self.mongo['customer'].find(query, projection) # 遍历转换_id为字符串 data = [{**item, "_id": str(item["_id"])} for item in raw_data]
注意事项
- 如果你的projection配置了
"_id": 0不返回_id字段,不需要做上述处理,本身不会触发序列化报错 - 如果数据中还有其他嵌套字段包含ObjectId类型,可参照上述逻辑递归转换,或者在聚合管道中指定对应嵌套字段的转换规则
内容的提问来源于stack exchange,提问作者NVS
相关产品推荐
相关产品推荐

