You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:45:03