如何从Firestore子集合中获取数据?现有代码无法实现
问题分析与修复
你的代码存在两个核心问题,导致无法成功获取子集合数据:
- 异步操作未正确等待:
forEach中的get()是异步调用,但你既没有等待它执行完成,也没有收集这些异步操作的结果。同时then的回调函数没有返回任何值,最终schedules变量会是null。 - 未正确汇总数据:原代码没有将子集合查询到的结果收集起来,后续调用
mapRecords时自然拿不到有效数据。
修复后的代码
getSchedules() async { // 获取所有医生的文档快照 final doctorsSnapshot = await FirebaseFirestore.instance.collection('doctors').get(); // 批量处理所有子集合查询,用Future.all等待所有异步操作完成 final schedulesResults = await Future.wait( doctorsSnapshot.docs.map((doctorDoc) async { // 查询当前医生的schedules子集合 final schedulesSnapshot = await FirebaseFirestore.instance .collection('doctors') .doc(doctorDoc.id) .collection('schedules') .get(); // 返回该医生的所有schedules数据 return schedulesSnapshot.docs.map((doc) => doc.data()).toList(); }) ); // 将多维数组扁平化,得到所有schedules的合并列表(按需选择) final allSchedules = schedulesResults.expand((list) => list).toList(); mapRecords(allSchedules); }
额外优化建议
- 你添加的
where("docid", isEqualTo: element.id)条件属于冗余操作:因为schedules是对应医生文档的子集合,里面的文档天然归属该医生,除非有特殊业务过滤需求,否则可以删除这个条件,减少查询开销。 - 如果只需要获取特定医生的排班数据,无需遍历所有医生,直接通过医生ID定位子集合查询,效率会更高。
内容的提问来源于stack exchange,提问作者Aakash Raza
相关产品推荐
相关产品推荐

