如何使用Python克隆MongoDB单条文档并修改属性后保存
MongoDB单条文档克隆实现方案
问题根源
你提供的代码出现原文档被覆盖的问题,核心原因有两个:
new_user = testing_user属于引用赋值,两个变量指向同一块内存地址,修改new_user实际是修改原文档对象- MongoDB中
_id是文档主键唯一标识,调用save方法时如果提交的文档携带已存在的_id,MongoDB会默认执行更新操作覆盖对应_id的原文档
实现方案
核心逻辑是拷贝原文档数据后删除原有_id字段,MongoDB保存无_id的文档时会自动生成新的主键,插入为全新文档,修正后的代码如下:
import copy # 查询原测试用户文档 testing_user = await db().find_one(User, User.email == "testing@company.com") # 深拷贝生成独立的新文档对象,避免嵌套属性关联原对象 new_user = copy.deepcopy(testing_user) # 删除原有主键_id,后续保存时会自动生成新的唯一_id del new_user._id # 修改新文档的自定义属性,注意唯一索引字段(如邮箱)不要和原有文档重复 new_user.attr1 = "foo" new_user.attr2 = "bar" new_user.email = "new_testing@company.com" new_user.username = "new_test_user" # 保存新文档,此时会插入新记录不会覆盖原文档 await db().save(new_user)
注意事项
- 如果你使用的ODM框架返回的是字典格式的查询结果,将删除
_id的写法改为del new_user["_id"]即可 - 若不需要保留原文档的所有字段,可在查询时通过投影指定返回字段,减少冗余属性拷贝
- 确保新文档的唯一索引字段(如邮箱、用户名)与已有文档不重复,否则会触发唯一键约束报错
内容的提问来源于stack exchange,提问作者GSwart
相关产品推荐
相关产品推荐

