如何从Firestore嵌套Map提取数据?代码错误排查
Firebase Firestore Map类型字段数据提取错误排查
我在Firestore中有一个名为users的集合,每个文档包含一个contacts的Map类型字段,该字段内部是嵌套的Map数据。我尝试将联系人数据提取到contactDetailsArr数组中,但lastMessage和time始终返回undefined。
期望输出
[{userId: GA3yfqLaaTaDugSrFOQujnj34Y13, lastMessage:"Here there!!!", time: t {seconds: 1663220632, nanoseconds: 36000000} }, {userId: TZjQb8yoYfQbowloQk1uLRCCPck1, lastMessage:"How are you?", time:t {seconds: 1663306634, nanoseconds: 859000000} }]
实际输出
[{userId: GA3yfqLaaTaDugSrFOQujnj34Y13, lastMessage:undefined, time:undefined }, {userId: TZjQb8yoYfQbowloQk1uLRCCPck1, lastMessage:undefined, time:undefined }]
原代码
export const getUserContacts= () =>{ const contactDetailsArr=[]; db.collection("users").doc(userId).get() //userId is equal to "3aTGU..." .then(docs=>{ const contactsObject= docs.data().contacts; for(let contact in contactsObject){ contactDetailsArr.push({userId: contact, lastMessage: contact.lastMsg, time: contact.lastMsgTime }) } }) .catch(err=>{ console.log(err); }) }
错误原因与修正
错误点
在for...in循环中,contact变量存储的是contactsObject的键名(即userId字符串),而不是该键对应的嵌套Map数据。你直接从键名字符串上访问lastMsg和lastMsgTime属性,自然会返回undefined。
Firestore的Map类型通过data()读取后会转换为普通JavaScript对象,所以必须通过contactsObject[contact]获取键对应的实际值,再从中提取字段。
修正后的代码
export const getUserContacts= () =>{ const contactDetailsArr=[]; db.collection("users").doc(userId).get() .then(doc=>{ // 变量名改为doc更准确,因为get()返回单个文档快照 const contactsObject= doc.data().contacts; for(let contactId in contactsObject){ // 获取当前联系人的嵌套Map数据 const contactData = contactsObject[contactId]; contactDetailsArr.push({ userId: contactId, lastMessage: contactData.lastMsg, time: contactData.lastMsgTime }) } }) .catch(err=>{ console.log(err); }) }
补充说明:如果contacts是Firestore原生的Map对象(而非转换后的JS对象),可以用contactsObject.get(contactId)来获取对应值,但通常data()返回的已经是普通JS对象,用方括号访问即可。
内容的提问来源于stack exchange,提问作者Abby
相关产品推荐
相关产品推荐

