使用PyMongo批量Upsert时遇batch op errors occurred错误求助
我之前也遇到过类似的批量upsert报错问题,咱们来一步步拆解排查:
首先,先看你用的PyMongo批量操作API——initialize_unordered_bulk_op()其实从PyMongo 3.0版本开始就已经被废弃了,官方推荐使用更简洁可靠的bulk_write()接口,旧API的一些语法细节容易踩坑,这可能是你报错的核心原因。
你提到集合是空的、两个_id也不重复,那问题大概率出在旧bulk操作的update()方法上:在旧的BulkOperationBuilder里,update()对应的是MongoDB的updateMany命令,哪怕你的filter是精准匹配唯一_id,updateMany的upsert逻辑和单条更新的updateOne还是有差异,在空集合场景下可能触发异常。
给你两个解决方案,优先推荐第一个:
方案1:使用新版bulk_write() API(推荐)
替换掉旧的批量操作代码,改用UpdateOne配合bulk_write,代码更清晰,也避免旧API的坑:
from pymongo import UpdateOne # 构建批量操作列表 operations = [] for record in siteProductDataList: filter_dict = {'_id': record['_id']} update_dict = {'$set': {'Configuration': record['Configuration']}} # 加入upsert=True的更新操作 operations.append(UpdateOne(filter_dict, update_dict, upsert=True)) # 执行批量操作 result = db.RPT_Table.bulk_write(operations) # 打印结果确认执行情况 print(f"成功插入 {result.upserted_count} 条记录,更新 {result.modified_count} 条记录")
方案2:修复旧版bulk API的语法
如果你暂时不想更换API,只需要把代码里的update(SetDict)改成update_one(SetDict)即可——update_one()对应MongoDB的updateOne命令,完全符合你单条upsert的需求:
bulk = db.RPT_Table.initialize_unordered_bulk_op() for record in siteProductDataList: print(record['_id']) FilterDict = {'_id': record['_id']} SetDict = {'$set': {'Configuration': record['Configuration']}} # 把update替换为update_one bulk.find(FilterDict).upsert().update_one(SetDict) result = bulk.execute()
另外,你可以再确认下MongoDB的版本,如果是3.0之前的老旧版本,复合_id的upsert可能存在兼容性问题,但你的场景是全新空集合,这个概率很低。
内容的提问来源于stack exchange,提问作者Tarun Khaneja
相关产品推荐
相关产品推荐

