不能读取firebase集合与用户id与Flutter web,而有没有问题的移动的flutter

bgtovc5b  于 2023-06-24  发布在  Flutter
关注(0)|答案(2)|浏览(102)

我有扑移动的和扑网使用相同的firebase firestore。但不知何故,我无法从网上读取所有数据。

final collection = FirebaseFirestore.instance.collection(_allReports);      
print('* * * allReports - ${(await collection.get()).docs.length}');

在输出0上,而上面的屏幕截图显示了两个项目。我有一些经验,如果我创建的项目与随机符号,而不是用户id,它的作品。如果尝试通过提供完整路径'all_reports/user_id/reports/'来获取报告,它也可以。

规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if isUserAuthenticated();
    }
    match /all_reports/{document=**} {
        allow read: if true;
    }
    
    /* Functions */
    function isUserAuthenticated() {
      return request.auth.uid != null; 
    }
  }
}

有人能解决这个问题吗?

bhmjp9jg

bhmjp9jg1#

查看文档如何以斜体显示:这意味着这些文档仅作为一个或多个子集合的“容器”存在,但它们不是“真正的”文档。
它们显示在Firestore控制台中(斜体),以便您能够打开子集合(即reports),但它们实际上并不存在,因此docs.length的值为0(查询返回的QuerySnapshot为空)。
这也解释了为什么当你用下面的路径查询子集合时,你会得到一个非空的QuerySnapshotall_reports/user_id/reports/
如果要查询all_reports集合,则需要创建相应的文档。但您确定需要查询此集合吗?

更新您的评论:

我想获取所有用户的所有报告
您可以使用收集组查询。:集合组由具有相同ID的所有集合组成(即reports在你的情况下)。
请注意,如果您需要每个报告的用户uid(即“假”父文档),您可以使用本SO answer中解释的方法,即获取报表文档的父引用(它是用户的reports子集合),然后获取该子集合的父文档。

vq8itlhq

vq8itlhq2#

我找到解决办法了!这比我想象的容易。

final groupReportCollections = fb.collectionGroup(_reports);
groupReportCollections.get().then((value) 
=> value.docs.forEach((e) => log('item: ${e.data()}')));

相关问题