Firestore中map of maps结构更新的简化实现及免读取方案咨询
方案1:使用点路径简化嵌套字段更新(无需提前读取、无需手动初始化父级map)
Firestore原生支持点路径表示法定位嵌套字段,执行更新时如果上层的requests、requests.outgoing map不存在,Firestore会自动创建,完全不需要提前读取文档、手动判空初始化父级结构,代码可以简化为:
const outgoingKey = `requests.outgoing.${personID}`; t.update(usersRef, { [outgoingKey]: data });
这种方式可以直接省掉你现有代码里的多层判空逻辑,也不需要提前读取userData内容。
方案2:新增「不覆盖已有personID条目」约束的两种实现
如果你要求必须保证personID对应条目不存在时才写入,可选两种方案:
- 服务端校验方案(无需前端提前读):直接在Firestore安全规则里添加校验逻辑,客户端不需要做任何提前读取操作,更新请求发出后服务端会自动判断,如果目标条目已存在就直接拒绝写入,规则参考:
match /users/{userId} { allow update: if !(personID in resource.data.requests.outgoing.keys()) || request.resource.data.requests.outgoing[personID] == resource.data.requests.outgoing[personID]; } - 代码逻辑控制方案:可以结合ES2021的空值合并赋值运算符简化原有事务内的判空逻辑,代码更简洁:
// 事务内读取到userData后简化判空 userData.requests ??= {}; userData.requests.outgoing ??= {}; // 判断无对应条目才执行更新 if (!userData.requests.outgoing[personID]) { userData.requests.outgoing[personID] = data; t.update(usersRef, userData); }
内容的提问来源于stack exchange,提问作者Lucibus
相关产品推荐
相关产品推荐

