You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:45:45