【问题标题】:how to get data from firestore sub-collection如何从firestore子集合中获取数据
【发布时间】:2020-11-26 13:57:38
【问题描述】:

我有一个 Firestore 数据库,其中有“Singer”,然后在每个歌手内部都有每个歌手的“Song List”子集合。我能够从主集合中获取数据,但不能从子集合中获取数据。你们能帮忙吗?

流生成器

StreamBuilder(
        stream: Firestore.instance.collection('singers').snapshots(),

ListView.Builder

ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (context, index) => SingleChildScrollView(

这是我想从子集合中显示数据的地方

Text(
                                  snapshot.data.documents[index]['name'],
                                  style: TextStyle(
                                      fontSize: 20, color: Colors.red[500]),
                                )

数据库

【问题讨论】:

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

为了澄清你在说什么:你想要一个所有来自所有歌手的歌曲列表,

简单易行。 CollectionGroup 是你的朋友。

我没有使用你的环境,但我可以看到:

StreamBuilder(
        stream: Firestore.instance.collectionGroup('song list').snapshots(),

是你需要的开始。 collectionGroup 将 所有 个名为“歌曲列表”的子集合视为一个集合。

注意(因为这个总是出现) 返回的每个 documentSnapshot 都包含一个字段 'refpath' - 这是一个字符串,其中包含指向该特定文档的完整路径。您可以简单地解析字符串以查找父文档或集合。例如,一首特定歌曲的 refPath ".../singers/{singerID}/songlist/{songID}"

顺便说一句,我强烈强烈建议不要使用歌手姓名作为文档 ID。查询通常是字段,而不是 documentID,因此它不会帮助您的代码找到艺术家,而且它们既不够独特,也不够随机分布以提高效率。让 Firestore 为您生成唯一的 documentID,并将艺术家姓名放在一个字段中。

【讨论】:

  • 感谢您的关注。让我告诉你..你打开应用程序..你按下一个标签为Singers的按钮,它会给你一个歌手列表..之后我想要的是当你点击它给出的歌手名字时你是那个歌手的歌曲列表...
【解决方案2】:

你可以这样读:

Firestore.instance.collection('singers').snapshot().listen((val)=>{
       val.documents.forEach((doc)=>{
          doc.reference.collection('song list')
           .getDocuments().then((res)=>{
               res.douments.forEach((d)=>{
                       print(d.data);
                    })
              })
        })
    });

现在,这为您提供了所有集合文档的流 singers 和他们的 subcollection

【讨论】:

  • 感谢@habib。但它只会读取一份文件。我想从所有文档中流式传输列表
  • 好的,现在我得到了你想要的,我再次更新了我的答案,现在它为所有歌手提供了你。
  • 上面写着,the method "snapshot" isn't defined for the type "CollectionReference"
  • 这是快照,抱歉
  • 我做到了。那样会给出这个错误The argument type 'StreamSubscription<QuerySnapshot>' can't be assigned to the parameter type 'Stream<dynamic>'
【解决方案3】:

您可以通过像这样访问文档中的子集合来从集合中获取数据

Firestore.instance.collection('singers').document('aryana sayeed').collection('song list').snapshots()

Firestore.instance.collection('singers/aryana sayeed/song list').snapshots()

【讨论】:

  • 感谢@jideguru。但它只会读取一份文件。我想从所有文档中流式传输列表
  • 你不能这样获取文档的子集合,你必须单独做请求
  • 所以会有数百个你说的是我必须为他们每个人创建一个不同的页面
  • 有没有一种方法可以代替“aryana sayeed”而放置文档ID
  • 我在这种情况下“aryana sayeed”是您的文档 ID,因此您可以将其替换为您正在使用的其他文档 ID。我只是以它为例
猜你喜欢
  • 2021-10-31
  • 2019-07-16
  • 2021-09-18
  • 2020-06-03
  • 2020-09-05
  • 2021-08-02
  • 2022-12-06
  • 2020-09-03
  • 2020-06-08
相关资源
最近更新 更多