Firestore如何检索employee集合下子子集合的presence考勤数据
关联获取员工对应考勤数据实现方案
根据你贴的Firestore集合结构,分两种数据存储场景实现,直接在你现有拉取员工数据的代码基础上改即可:
场景1:presence是employee文档下的嵌套子集合
从你的集合路径截图判断,这是概率最高的存储方式:每个员工文档下单独挂presence子集合存储该员工的所有考勤记录。
拿到每个员工的文档ID后,直接查询对应路径下的子集合即可,参考代码(基于你现在用的Firebase Web SDK v9 写法):
import { getDocs, collection } from "firebase/firestore"; import { db } from "./your-firebase-config-path"; const getEmployeeWithPresence = async () => { // 复用你现有拉取全量员工的逻辑 const employeeSnapshot = await getDocs(collection(db, "employee")); const result = []; for (const empDoc of employeeSnapshot.docs) { const empBaseInfo = empDoc.data(); // 查询当前员工下的所有考勤记录 const presenceSnapshot = await getDocs( collection(db, `employee/${empDoc.id}/presence`) ); const presenceList = presenceSnapshot.docs.map(pDoc => ({ presenceId: pDoc.id, ...pDoc.data() })); result.push({ employeeId: empDoc.id, ...empBaseInfo, presence: presenceList }); } return result; } // 调用即可拿到带考勤的完整员工数据 getEmployeeWithPresence().then(data => console.log(data));
场景2:presence是和employee平级的顶级集合
如果你的考勤数据存在顶级集合,每个考勤记录通过employeeId字段关联对应员工,不要循环发N次查询,一次性拉全量数据后在内存做关联,性能更高:
import { getDocs, collection } from "firebase/firestore"; import { db } from "./your-firebase-config-path"; const getEmployeeWithPresence = async () => { // 并行拉取全量员工、全量考勤数据,减少等待时间 const [employeeSnapshot, presenceSnapshot] = await Promise.all([ getDocs(collection(db, "employee")), // 如果考勤数据量太大,这里可以加where条件过滤时间范围,比如只查当月数据 getDocs(collection(db, "presence")) ]); // 先把考勤数据按员工ID分组 const presenceGroup = {}; presenceSnapshot.docs.forEach(pDoc => { const pData = { presenceId: pDoc.id, ...pDoc.data() }; const bindEmpId = pData.employeeId; // 替换成你考勤表里存员工ID的实际字段名 if (!presenceGroup[bindEmpId]) presenceGroup[bindEmpId] = []; presenceGroup[bindEmpId].push(pData); }); // 遍历员工数据绑定对应考勤 return employeeSnapshot.docs.map(empDoc => ({ employeeId: empDoc.id, ...empDoc.data(), presence: presenceGroup[empDoc.id] || [] })); }
注意事项
- 如果考勤数据量级大,不要无差别拉全量,给考勤查询增加时间范围过滤条件,比如只拉取近3个月的记录,减少传输的数据量
- 循环内的异步查询必须加
await,不要写 fire-and-forget 的异步逻辑,会导致考勤数据还没返回就执行后续逻辑 - 如果需要做数据实时更新,把代码里的
getDocs替换成onSnapshot即可,关联逻辑不变
参考资料截图
- Employee集合截图:

- Presence集合截图:

- 获取employee集合所有用户的运行效果截图:

- 获取所有用户的实现代码截图:

内容的提问来源于stack exchange,提问作者6A_Vindy Bagus Prasetyo
相关产品推荐
相关产品推荐

