如何在Firestore中检索未知名称分组下子集合的文档
如何检索Firestore中所有分组下的卡片文档?
我来帮你搞定这个问题!你当前的代码只能获取单个已知分组的卡片数据,要处理分组名称未知且存在多个分组的情况,我们需要分两步来实现:先获取该用户下的所有分组,再逐个拉取每个分组对应的卡片。
因为Firestore的查询是分层的,没有直接跨多个子集合批量查询的API,所以我们需要结合异步处理来完成这个需求,用async/await + Promise.all的方式会让代码更清晰且高效。
完整实现代码
async function getAllUserGroupsAndCards(userEmail) { try { // 第一步:获取该用户下的所有分组文档 const groupsSnapshot = await db.collection('usersx').doc(userEmail).collection('group').get(); // 第二步:并行处理每个分组,拉取对应的卡片数据 const groupPromises = groupsSnapshot.docs.map(async (groupDoc) => { const groupName = groupDoc.id; // 获取当前分组下的所有卡片 const cardsSnapshot = await groupDoc.ref.collection('card').get(); // 将卡片文档转换为你需要的格式 const cards = cardsSnapshot.docs.map(cardDoc => ({ front: cardDoc.data().front, back: cardDoc.data().back })); // 返回单个分组的结构 return { [groupName]: { cards } }; }); // 等待所有分组的卡片数据都获取完成 const allGroups = await Promise.all(groupPromises); // 组装成你预期的最终输出结构 const finalResult = { id: userEmail, group: allGroups }; console.log(finalResult); return finalResult; } catch (error) { console.error('获取数据时出错:', error); throw error; } } // 调用函数,传入当前用户的邮箱 getAllUserGroupsAndCards(this.user.email);
代码说明
- 第一步:先获取用户文档下
group集合的所有文档快照,这一步能拿到所有分组的名称(也就是文档ID)。 - 第二步:用
map遍历每个分组文档,同时发起每个分组下card集合的查询。这里用Promise.all来并行执行所有卡片查询,避免串行等待,提升效率。 - 数据转换:把每个卡片文档的
front和back字段提取出来,组装成你需要的卡片对象结构。 - 最终组装:把用户ID和所有分组的卡片数据组合成你指定的输出格式。
这样执行后,就能得到和你预期完全一致的结构啦!
内容的提问来源于stack exchange,提问作者MK01111000
相关产品推荐
相关产品推荐

