Firebase Firestore:使用set(merge:true)为何删除文档其他字段?
Firestore set({merge: true}) 覆盖文档字段的原因及解决办法
可能的原因
目标文档ID错误
若传入的house_id对应的文档不存在,set({merge: true})会创建一个仅包含residents字段的新文档。你可能误将这个新文档当成了原文档,以为原字段被删除。Admin SDK版本bug
部分旧版本的Firebase Admin SDK对merge参数的处理存在问题,导致合并逻辑未生效,执行了全量覆盖操作。存在前置修改操作
如果在这段set代码执行前,有其他操作(比如无merge参数的set、删除字段的update)修改了原文档,删除了其他字段,那么执行后自然只剩residents字段。
解决方案
改用update操作(推荐)
update操作专门用于修改文档的指定字段,字段不存在时会自动创建,且不会影响文档中的其他字段,完全符合你的需求。修改后的代码如下:
db.collection("houses") .doc(house_id) .update({ residents: admin.firestore.FieldValue.arrayUnion({ uid: context.auth.uid, first_name: driverData.first_name, last_name: driverData.last_name, }), });
其他排查步骤
- 验证
house_id的取值是否正确,确保指向目标文档; - 将Firebase Admin SDK升级到最新稳定版本,避免版本兼容问题。
内容的提问来源于stack exchange,提问作者Tsabary
相关产品推荐
相关产品推荐

