Python操作Firestore时如何避免原有数据字段被意外覆盖
问题原因
你当前使用的set方法搭配merge=True仅实现顶层字段的合并逻辑,你传入的参数是{"general": info_dic},相当于直接把general这个顶层字段整体替换为新的info_dic对象,因此general下的同名字段(比如你的position)会被新值覆盖,并不会做嵌套层级的字段合并。
解决方案
方案1:先读取原有数据再合并写入(适合批量新增不确定字段的场景)
先拉取已有文档的general字段数据,过滤掉新数据中已经存在的键,仅新增不存在的字段后再写入,完全可控不会覆盖原有值:
info_referenc = db.collection(u'test').document(u'bob') doc = info_referenc.get() # 读取原有general字段内容,文档不存在则初始化空字典 old_general = doc.get('general') if doc.exists else {} # 你的新数据 new_data = { 'name': 'bob', 'position': 'co-founder', 'age': 25 } # 仅新增原有数据中不存在的字段,已有字段跳过不覆盖 for key, value in new_data.items(): if key not in old_general: old_general[key] = value # 合并后写入 info_referenc.set({"general": old_general}, merge=True)
如果有并发写入的场景,可以搭配Firestore事务使用避免读写冲突。
方案2:使用嵌套字段更新语法(适合明确知道要新增哪些字段的场景)
直接用Firestore的.分隔嵌套字段语法调用update方法,仅指定需要新增的字段,不会修改已有字段:
info_referenc = db.collection(u'test').document(u'bob') # 直接指定要新增的嵌套字段,不会修改general下已有的position、name等字段 info_referenc.update({ "general.age": 25 })
内容的提问来源于stack exchange,提问作者jpy
相关产品推荐
相关产品推荐

