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

React Native Firestore子集合无法获取,请求技术协助

解决Firestore子集合数据获取问题

我来帮你排查这个子集合获取的问题~首先看你的代码,核心问题出在对get()返回值的处理上:

当你调用.collection('questions').get()时,返回的是QuerySnapshot(这是集合查询的结果,包含多个文档),而不是单个文档的DocumentSnapshot,所以直接调用.data()肯定会出错——因为QuerySnapshot根本没有这个方法。

修正后的代码示例

return (dispatch) => {
  firebase.firestore()
    .collection('questions')
    .doc(currentUser.uid)
    .collection('questions')
    .get()
    .then((querySnapshot) => {
      // 初始化数组存储所有问题数据
      const userQuestions = [];
      // 遍历查询快照里的每一个文档
      querySnapshot.forEach((doc) => {
        // 每个doc是单个文档的快照,调用.data()获取内容,同时保留自动生成的文档ID
        userQuestions.push({
          questionId: doc.id,
          ...doc.data() // 展开title、description等字段
        });
      });
      console.log('成功获取问题列表:', userQuestions);
      // 将数据dispatch到Redux store中
      dispatch({ type: 'FETCH_USER_QUESTIONS_SUCCESS', payload: userQuestions });
    })
    .catch((error) => {
      console.error('获取数据失败:', error);
      dispatch({ type: 'FETCH_USER_QUESTIONS_FAILURE', payload: error.message });
    });
};

关键知识点说明

  • QuerySnapshot vs DocumentSnapshot:调用collection().get()返回QuerySnapshot(多文档集合),调用doc().get()才返回单个文档的DocumentSnapshot。前者需要遍历才能拿到每个文档的数据,后者可以直接用.data()。
  • 保留文档ID:因为你的问题文档是自动生成ID的,建议把doc.id也存入数组,后续更新/删除问题时会用到这个ID。

额外排查点

  1. 确认currentUser.uid是有效的值,不是undefined或null(可以在调用前打印一下这个值)。
  2. 检查Firestore安全规则,确保当前用户有权限读取/questions/{userId}/questions/{questionId}路径下的数据,比如规则可以这样写:
    match /questions/{userId}/questions/{questionId} {
      allow read: if request.auth.uid == userId;
    }
    
  3. 如果返回的querySnapshot.empty为true,说明这个用户的子集合里没有任何文档,可以先确认数据是否正确写入了Firestore。

内容的提问来源于stack exchange,提问作者Gökhan Geyik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:15:30