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

pymongo执行bulk_write操作MongoDB报错,如何向集合写入新文档?

运行环境

  • Python: 3.8.8
  • pymongo: 3.12.9

报错根因

pymongo的bulk_write方法要求传入的是pymongo官方预定义的写操作类实例(比如UpdateOne/InsertOne/DeleteOne等),你传入的是Mongo Shell语法格式的自定义updateOne字典,不属于pymongo可识别的操作对象,因此抛出属性找不到的错误。

除此之外你的代码还有三个问题需要修正:

  1. 没有加upsert=True参数,匹配不到的文档不会自动插入,无法满足你的需求
  2. 把bulk_write放到了循环内部,每次循环都执行一次批量操作,性能极低
  3. 直接取d["RKK_K"],如果某条数据没有这个字段会直接报KeyError,示例中A、B两条数据就没有该字段
  4. 字符串格式的_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:36:05