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

在Firebase+Next.js中如何获取用户文档下的集合数组并传为Props?

解决方案

要获取users集合下所有文档的quiniela子集合数据并作为Props传递,你可以按以下步骤修改代码:

1. 保留用户文档ID

原代码只提取了文档数据,缺少访问子集合必需的文档ID,先修改用户数据的映射逻辑,把文档ID也包含进去:

export async function getServerSideProps() {
  const snapshot = await firebase
    .firestore()
    .collection("users")
    .orderBy("points", "desc")
    .get();

  // 保留文档ID,后续用于访问子集合
  let users = snapshot.docs.map((doc) => ({
    id: doc.id,
    ...doc.data()
  }));

2. 并行获取所有用户的quiniela集合

利用Promise.all并行请求所有用户的子集合,避免串行请求导致的性能问题,有两种常用处理方式:

方式一:将所有quiniela数据合并为一个数组

如果需要把所有用户的quiniela数据统一存到一个数组中:

// 生成获取每个用户quiniela集合的Promise数组
  const quinielaPromises = users.map(async (user) => {
    const quinielaSnapshot = await firebase.firestore()
      .collection("users")
      .doc(user.id)
      .collection("quiniela")
      .get();
    
    // 返回该用户的quiniela数据,带上用户ID方便关联
    return quinielaSnapshot.docs.map(doc => ({
      userId: user.id,
      ...doc.data()
    }));
  });

  // 等待所有请求完成,用flat()将二维数组转为一维
  const allQuinielas = (await Promise.all(quinielaPromises)).flat();

方式二:将quiniela数据关联到对应用户对象

如果需要每个用户数据中包含自己的quiniela集合:

// 遍历用户,为每个用户附加其quiniela数据
  const usersWithQuinielas = await Promise.all(users.map(async (user) => {
    const quinielaSnapshot = await firebase.firestore()
      .collection("users")
      .doc(user.id)
      .collection("quiniela")
      .get();
    
    const quinielas = quinielaSnapshot.docs.map(doc => doc.data());
    return {
      ...user,
      quinielas
    };
  }));

3. 传递Props

最后将处理好的数据作为Props返回:

// 根据选择的方式返回对应数据
  return {
    props: {
      // 对应方式二
      users: usersWithQuinielas,
      // 或对应方式一
      users,
      allQuinielas
    }
  };
}

注意事项

建议添加错误捕获逻辑,避免单个子集合请求失败导致整个页面渲染失败:

try {
  // 所有Firestore请求逻辑
} catch (error) {
  console.error("获取数据失败:", error);
  // 返回错误状态或默认数据
  return { props: { users: [], allQuinielas: [] } };
}

内容的提问来源于stack exchange,提问作者Brizuela Go

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:50:42