如何使用PyMongo基于Python字典更新Mongo文档键值或插入新键值对
pymongo 批量更新/新增文档字段实现方案
你不需要手动逐个指定要更新的键,直接将待更新的字段字典传入$set操作符即可实现需求,具体实现如下:
实现代码
# 待同步的本地字典 dic = {"_id":1, "A":123, "B":234, "C":222} # 拷贝字典后移除_id字段,_id作为查询条件不需要参与更新 update_fields = dic.copy() update_fields.pop("_id") # 执行更新操作 collection.update_one( filter={"_id": dic["_id"]}, update={"$set": update_fields} )
逻辑说明
$set操作符原生支持传入多键值对字典,行为完全匹配你的需求:
- 字典里的键在MongoDB文档中已存在时,直接覆盖更新对应的值
- 字典里的键在MongoDB文档中不存在时,自动新增该键值对
- 原文档中存在、但字典里没有的键(比如示例中的
D字段)会完整保留,不会被删除或修改
执行上述代码后,目标文档会变成你预期的结果:
{"_id":1,"A":123,"B":234,"D":999,"C":222}
补充说明
- 你之前尝试的写法存在两处错误:
- pymongo 3.x以上版本推荐使用
update_one(更新单条匹配文档)/update_many(更新所有匹配文档),旧版update方法已废弃 - 方法调用需要用圆括号传入参数,
$set是更新参数的操作符键,不能直接写{"set"}占位
- pymongo 3.x以上版本推荐使用
- 如果需要在_id对应文档不存在时自动创建新文档,可以在调用方法时加上
upsert=True参数:
collection.update_one( filter={"_id": dic["_id"]}, update={"$set": update_fields}, upsert=True )
内容的提问来源于stack exchange,提问作者Jennifer Therese
相关产品推荐
相关产品推荐

