pymongo执行bulk_write操作MongoDB报错,如何向集合写入新文档?
运行环境
- Python:
3.8.8 - pymongo:
3.12.9
报错根因
pymongo的bulk_write方法要求传入的是pymongo官方预定义的写操作类实例(比如UpdateOne/InsertOne/DeleteOne等),你传入的是Mongo Shell语法格式的自定义updateOne字典,不属于pymongo可识别的操作对象,因此抛出属性找不到的错误。
除此之外你的代码还有三个问题需要修正:
- 没有加
upsert=True参数,匹配不到的文档不会自动插入,无法满足你的需求 - 把
bulk_write放到了循环内部,每次循环都执行一次批量操作,性能极低 - 直接取
d["RKK_K"],如果某条数据没有这个字段会直接报KeyError,示例中A、B两条数据就没有该字段 - 字符串格式的
_id没有转成ObjectId类型,插入新文档时会把_id存为字符串,和存量数据的类型不一致
修正后可直接运行的代码
from pymongo import MongoClient, UpdateOne from bson.objectid import ObjectId import datetime # 此处省略你初始化MongoClient、获取db对象的原有代码 operations = [] for d in data: # 动态构造更新字段,避免无RKK_K字段时报错 set_content = { "_id": ObjectId(d["_id"]), "Sector": d["Sector"], "RKK_T": d["RKK_T"], "RKK_M": d["RKK_M"], "lastModified": d["lastModified"] } if "RKK_K" in d: set_content["RKK_K"] = d["RKK_K"] # 构造pymongo要求的UpdateOne实例 op = UpdateOne( filter={"Sector": d["Sector"]}, update={"$set": set_content}, upsert=True # 核心参数:匹配到就更新,匹配不到就插入新文档 ) operations.append(op) # 所有操作组装完成后一次性执行批量写入 result = db.collection.bulk_write(operations) # 可打印执行结果确认状态 print(f"匹配到的存量文档数:{result.matched_count}") print(f"更新修改的文档数:{result.modified_count}") print(f"新插入的文档数:{result.upserted_count}")
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

