Firestore的set()方法是否支持点表示法更新嵌套字段?
问题根因
- Firestore 的
set()方法默认不识别字符串形式的点分隔嵌套字段路径,只有update()方法原生支持该语法。你直接将"messages.totalMessages"作为对象键传入set()时,Firestore 会将整个字符串识别为顶层字段名,而非嵌套路径,这就是生成错误结构的核心原因。 - 你要求必须使用带
merge: true的set()方法满足「文档不存在即创建、存在则更新对应字段」的需求,不需要更换方法,只需调整传入参数的格式即可。
解决方案
有两种可行的修改方式,都无需改动你现有的updateUserLimitations函数逻辑:
方案1:传入嵌套对象结构
直接构造嵌套的对象结构作为更新参数,merge: true会自动做深度合并,不会覆盖messages下已有的initialDate字段:
updateUserLimitations(userId, { messages: { totalMessages: admin.firestore.FieldValue.increment(1) } });
方案2:使用FieldPath封装嵌套路径
如果你想沿用路径拆分的写法,可以用Firestore提供的FieldPath类型封装嵌套路径,set()配合merge: true可以正确识别该类型的键对应的嵌套层级:
updateUserLimitations(userId, { [new admin.firestore.FieldPath('messages', 'totalMessages')]: admin.firestore.FieldValue.increment(1) });
两种方案都可以实现预期效果:文档不存在时自动创建对应结构,文档存在时仅更新messages.totalMessages字段,保留messages下的initialDate等原有字段。
内容的提问来源于stack exchange,提问作者Victor Molina
相关产品推荐
相关产品推荐

