在 Flutter 中访问 Firestore 子集合

问题描述 投票:0回答:1

我有一个 Flutter 聊天应用程序。

FireStore的结构为:

chats
(集合)>
roomId
(随机生成的id,这是一个文档)>
users
(集合)>
email
(用户的电子邮件,这是一个文档)>
messages
(集合)>
messageId
(随机生成的id,这是一个文档)>实际的聊天。

当我使用以下代码时它可以工作。这给出了特定用户在房间中的所有消息。

FirebaseFirestore.instance
        .collection('chats')
        .doc(roomId)
        .collection('users')
        .doc(user)
        .collection('messages')
        .orderBy('timestamp', descending: true)
        .snapshots(),

但是,我需要获取房间中所有用户的列表。这是我尝试过的代码,没有得到任何结果,空列表。

QuerySnapshot<Map<String, dynamic>> userCollection = await FirebaseFirestore.instance
          .collection('chats')
          .doc(roomId)
          .collection('users')
          .get();

这是商店设定的规则。

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

我需要获取房间中所有用户的列表。 如有任何帮助,我们将不胜感激。

flutter firebase google-cloud-firestore
1个回答
0
投票

如果您得到空结果,则说明您的安全规则允许该操作 - 因此这些不是空列表的原因。

更有可能的是,您在

/chats/$roomId/user

 集合中实际上没有任何文档。请记住:

    Firestore 控制台/Web 界面以斜体显示任何实际不存在文档但在该文档
  • 存在较低级别内容的路径的文档 ID。
  • 当该路径中实际存在文档时,Firestore API 仅返回文档快照。因此,当文档 ID 以斜体显示时,它
  • 不会返回文档快照。
如果这确实是问题的原因,那么正常的解决方法是为每个用户创建一个文档。它不必有太多(甚至任何)字段,但文档需要存在。或者/此外,您可以在较低级别的集合上使用文档组查询,以查看是否可以从中重建用户。

有关此内容的更多信息,另请参阅:

  • Firestore DB - 以斜体显示的文档
  • 为什么非自动生成的文档 ID 在 Firestore 控制台中以斜体显示?
  • Firestore 查询不返回任何文档,即使它们在控制台中以斜体显示
© www.soinside.com 2019 - 2024. All rights reserved.