Flutter Firebase:当前用户获取自身创建的Requests子集合数据
解决Firestore中用户仅获取自身创建的子集合数据问题
问题分析
你遇到的问题核心在于三种查询方式的逻辑错误或配置缺失:
- 第一种查询用了
doc()生成随机空文档引用,没有指向ADS集合中实际存在的文档,导致无法定位到目标Requests子集合; - 第二种collectionGroup查询失败,大概率是缺少对应的复合索引,或者代码中存在语法错误(比如写成了
snapshot而非snapshots()); - 第三种查询能返回所有数据,但没有权限过滤或索引支持,无法精准获取自身数据。
解决方案
方案一:明确指定ADS文档ID(已知目标ADS文档时使用)
如果用户B知道自己创建的Requests子集合所属的ADS文档ID,直接指定该ID进行查询:
FirebaseFirestore.instance .collection('ADS') .doc('目标ADS文档的ID') // 替换为实际存在的ADS文档ID,不能用空的doc() .collection('Requests') .where('UID', isEqualTo: uid) // uid为用户B的Firebase UID .snapshots()
方案二:使用Collection Group查询(未知具体ADS文档时使用)
如果用户B的Requests子集合可能分布在ADS的多个文档下,通过collectionGroup查询需要两步配置:
- 确保数据正确性:每个Requests子集合中的文档都正确存储了用户B的UID字段(字段名需与查询中的
UID完全一致,注意大小写); - 创建复合索引:
- 登录Firebase控制台,进入Firestore数据库页面;
- 切换到「索引」标签页,选择「复合索引」,点击「添加索引」;
- 集合ID填写
Requests,添加字段UID并选择升序,勾选「集合组」选项; - 保存索引,等待几分钟让索引构建完成;
- 正确的查询代码:
FirebaseFirestore.instance .collectionGroup('Requests') .where('UID', isEqualTo: uid) .snapshots() // 注意是snapshots()而非snapshot,避免语法错误
额外安全保障:配置Firestore安全规则
为了防止客户端查询越权,建议在Firebase控制台配置安全规则,确保用户只能读写自身的Requests数据:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /ADS/{adsDoc}/Requests/{requestDoc} { allow read: if request.auth != null && request.resource.data.UID == request.auth.uid; allow write: if request.auth != null && request.resource.data.UID == request.auth.uid; } } }
内容的提问来源于stack exchange,提问作者Eben Oasis
相关产品推荐
相关产品推荐

