我有扑移动的和扑网使用相同的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;
}
}
}
有人能解决这个问题吗?
2条答案
按热度按时间bhmjp9jg1#
查看文档如何以斜体显示:这意味着这些文档仅作为一个或多个子集合的“容器”存在,但它们不是“真正的”文档。
它们显示在Firestore控制台中(斜体),以便您能够打开子集合(即
reports
),但它们实际上并不存在,因此docs.length
的值为0
(查询返回的QuerySnapshot
为空)。这也解释了为什么当你用下面的路径查询子集合时,你会得到一个非空的
QuerySnapshot
:all_reports/user_id/reports/
。如果要查询
all_reports
集合,则需要创建相应的文档。但您确定需要查询此集合吗?更新您的评论:
我想获取所有用户的所有报告
您可以使用收集组查询。:集合组由具有相同ID的所有集合组成(即
reports
在你的情况下)。请注意,如果您需要每个报告的用户uid(即“假”父文档),您可以使用本SO answer中解释的方法,即获取报表文档的父引用(它是用户的
reports
子集合),然后获取该子集合的父文档。vq8itlhq2#
我找到解决办法了!这比我想象的容易。