Firebase:如何获取所有assignee字段匹配指定用户值的子元素?
跨项目子集合查询指定用户工单实现方案
相关数据结构截图参考:

核心思路
由于projectTickets是挂载在每个项目文档下的子集合,无法直接跨父文档查询子集合内容,需先获取全量项目文档列表,再遍历每个项目的projectTickets子集合执行条件查询,最后合并符合要求的工单数据。
实现步骤
- 拉取所有项目的根文档列表
- 遍历每个项目文档,对其下的
projectTickets子集合执行条件查询,筛选assignee字段等于目标用户名的记录 - 将所有项目返回的符合条件的工单数组合并,得到最终结果
代码示例(Node.js + Firestore 场景)
async function getAssigneeAllTickets(targetUsername) { const allMatchedTickets = [] // 拉取全部项目文档 const projectsSnapshot = await db.collection('projects').get() // 遍历所有项目查询符合条件的工单 for (const projectDoc of projectsSnapshot.docs) { const ticketsSnapshot = await projectDoc.ref .collection('projectTickets') .where('assignee', '==', targetUsername) .get() // 格式化数据加入结果数组,同时携带所属项目ID方便后续关联使用 ticketsSnapshot.forEach(ticketDoc => { allMatchedTickets.push({ projectId: projectDoc.id, ticketId: ticketDoc.id, ...ticketDoc.data() }) }) } return allMatchedTickets }
性能优化方案
- 项目数量较多时,可将串行遍历改为
Promise.all并行查询,大幅减少耗时 - 若该查询接口调用频次高,可新增全局工单总集合,工单创建时同步写入总集合,后续直接查询总集合即可避免遍历所有项目
- 提前为
projectTickets集合的assignee字段建数据库索引,提升条件查询速度
内容的提问来源于stack exchange,提问作者samurai
相关产品推荐
相关产品推荐

