Flutter中如何过滤Firebase集合后获取对应子集合数据
问题原因
你调用where()方法对Channels集合做过滤后,返回的对象类型为Query,它代表符合过滤条件的多文档查询结果,不属于单个文档/集合引用类型,因此没有doc()方法,这是报错的直接原因。
解决方案
根据你的过滤场景,可选择以下对应实现方式:
场景1:过滤条件为匹配Channels的文档ID
你的示例代码里过滤逻辑是id = user.uid,如果此处的id指的是Channels的文档ID,直接指定文档ID即可,无需调用where过滤:
FirebaseFirestore.instance .collection('Channels') .doc(user.uid) // 直接传入文档ID获取对应文档引用 .collection("messages") .orderBy("createdAt") .snapshots(),
场景2:过滤条件为Channels文档内的普通字段
如果你的过滤条件是文档内存储的字段,需要先执行查询拿到匹配的Channels文档列表,再逐个获取对应子集合数据:
// 第一步:查询符合条件的Channels文档 QuerySnapshot channelQuery = await FirebaseFirestore.instance .collection('Channels') .where("你的过滤字段名", isEqualTo: 你的过滤值) .get(); // 第二步:遍历匹配文档,拉取对应messages子集合 for (var doc in channelQuery.docs) { QuerySnapshot messageQuery = await doc.reference .collection("messages") .orderBy("createdAt") .get(); // 此处处理获取到的messages数据 }
如果需要实时监听数据变化,可以监听Channels的查询快照,有更新时再绑定对应messages子集合的快照监听即可。
场景3:需要跨所有Channels查询messages数据
如果你的需求是拉取所有符合要求的messages数据,不需要区分所属的Channel文档,可以使用Firestore的集合组查询:
FirebaseFirestore.instance .collectionGroup("messages") // 全局查询所有名为messages的集合/子集合 .orderBy("createdAt") .snapshots();
如果需要关联父Channel的过滤条件,只需在messages文档里冗余父Channel的对应字段,再加where过滤即可,使用前需要在Firebase控制台配置对应集合组的索引。
内容的提问来源于stack exchange,提问作者bargougui sabri
相关产品推荐
相关产品推荐

