Firestore中使用邮箱作为键遇点解析问题的求助
解决Firestore中邮箱作为字段键时被拆分为子结构的问题
我太懂你这个困扰了——想用邮箱地址当invited字段下的键,结果Firestore总把邮箱里的点号当成嵌套分隔符,转义字符串也不管用对吧?这其实是因为你用字符串拼接字段路径的方式,Firestore会直接解析路径里的点,根本不会把它当成键的一部分。
问题根源
当你写groupUpdates['invited.' + invitedUserEmailAsKey + '.user_name']的时候,Firestore会把这个路径拆成多层嵌套:
- 先找
invited父字段 - 再把
invitedUserEmailAsKey里的每个点都当成下一层嵌套的分隔符 - 最后定位到
user_name子字段
哪怕你转义了邮箱里的点,Firestore的路径解析逻辑还是会把这些点当成嵌套标记,所以才会出现截图里的多层子结构。
正确的解决方案
有两种可靠的方式能解决这个问题:
方法1:用嵌套对象构造更新数据
直接构造嵌套对象,把原始邮箱地址作为invited下的键,Firestore就不会把点号解析成嵌套了:
var batch = db.batch(); var groupRef = db.collection("groups").doc(groupId); var invitationRef = db.collection("invitations").doc( groupRef.id + '_' + invitedUserEmail // 文档ID允许包含点号,无需转义 ); // 构造嵌套的更新结构 var groupUpdates = { invited: { [invitedUserEmail]: { // 直接用原始邮箱作为键 user_name: invitedUserName } } }; // 用merge: true避免覆盖invited下的其他邀请数据 batch.update(groupRef, groupUpdates, { merge: true });
方法2:使用FieldPath指定完整字段路径
如果你更习惯用路径的方式,可以用Firestore的FieldPath类来创建包含特殊字符的字段路径,它能正确识别邮箱里的点号是键的一部分:
var batch = db.batch(); var groupRef = db.collection("groups").doc(groupId); var invitationRef = db.collection("invitations").doc( groupRef.id + '_' + invitedUserEmail ); // 创建包含邮箱的FieldPath,避免点号被解析为嵌套 const invitedFieldPath = new db.FieldPath('invited', invitedUserEmail, 'user_name'); // 执行更新,同样用merge保护已有数据 batch.update(groupRef, invitedFieldPath, invitedUserName, { merge: true });
额外提示
- Firestore文档ID支持包含点号,所以
invitations集合的文档ID直接用groupId + '_' + invitedUserEmail就行,不需要转义邮箱里的点。 merge: true一定要加上,不然更新时会把invited字段下已有的其他邀请数据全部覆盖掉。
这么修改后,你的invited字段下就会把完整的邮箱地址作为单个键,不会再拆分成多层子结构了。
内容的提问来源于stack exchange,提问作者epeleg
相关产品推荐
相关产品推荐

