使用Pymongoarrow将Pandas Dataframe写入MongoDB遇ObjectId类型错误求助
使用Pymongoarrow写入DataFrame到MongoDB的类型错误解决方案
问题背景
从MongoDB读取包含ObjectId类型_id字段的DataFrame后,调用pymongoarrow.write方法写入新集合时触发类型转换错误,提示无法将bson.objectid.ObjectId转换为BSON格式。测试无自定义_id的简单数据集时代码可正常执行。
解决办法
1. 排除_id字段写入
如果不需要保留原数据的_id,直接删除该字段后写入,MongoDB会自动为新文档生成新的_id:
# 去掉_id字段后写入 write(db.new, df.drop(columns=['_id']))
2. 显式指定写入Schema
显式定义写入时的字段类型,和读取时的Schema保持一致,让pymongoarrow正确识别ObjectId类型:
from pymongoarrow.api import Schema from bson.objectid import ObjectId # 定义写入用的Schema write_schema = Schema({'_id': ObjectId, 'age': int, 'name': str}) write(db.new, df, schema=write_schema)
3. 转换_id为字符串后写入(可选)
若业务允许将_id以字符串形式存储,先转换字段类型再写入:
# 将ObjectId转换为字符串 df['_id'] = df['_id'].astype(str) write(db.new, df)
问题原因
从MongoDB读取的DataFrame中,_id字段存储的是Python原生的ObjectId对象,pymongoarrow的write方法默认类型推断逻辑无法正确识别该类型,导致BSON序列化失败。而测试用的简单数据集没有自定义_id,写入时MongoDB自动生成的_id会被pymongoarrow正确处理,因此不会报错。
内容的提问来源于stack exchange,提问作者Jeshurun Benedict
相关产品推荐
相关产品推荐

