Firebase向已有文档新增字段时使用merge: true仍清空原有数据问题
Firebase使用set+merge:true新增字段时原有数据被清空的问题解决方案
问题根因
两次操作的目标文档ID不一致,并未操作同一个文档:
- 创建文档时,调用
doc(JSON.stringify(project.orderId))生成的文档ID是经过JSON序列化的字符串。例如project.orderId值为123时,序列化后生成的文档ID为带引号的字符串"123" - 新增字段时,调用
doc(project.orderId)传入的是未经序列化的原始值,对应文档ID为不带引号的字符串123,和原有文档完全是两个独立文档
第二次操作实际是在新ID下创建了仅包含responsable字段的新文档,并非原有文档数据被清空,原有文档仍保存在序列化ID对应的路径下。
解决方案
方案1:对齐两次操作的文档ID生成逻辑
修改新增字段代码,保持文档ID生成规则和创建时一致即可正常更新原有文档:
await db.collection('projects').doc(JSON.stringify(project.orderId)).set( { 'responsable': project.responsable, }, { merge: true } )
方案2:移除不必要的JSON序列化逻辑(更推荐)
文档ID无需额外做JSON序列化,直接用原始orderId作为文档ID即可,避免后续出现ID混乱问题:
- 调整创建文档的代码:
await db.collection('projects').doc(project.orderId).set( { 'orderId': project.orderId, 'name': project.name, }, { merge: true } )
- 如果线上已存在大量序列化ID的历史文档,先做数据迁移将旧文档ID调整为原始
orderId,再统一全量替换所有读写逻辑的ID生成规则。
验证方法
可直接登录Firebase控制台进入projects集合查看,会同时存在两个ID相近的文档:
- 序列化ID的文档:保留原有
orderId、name字段 - 原始ID的文档:仅包含新增的
responsable字段
即可验证根因判断正确。
内容的提问来源于stack exchange,提问作者MVT KVM
相关产品推荐
相关产品推荐

