如何从firebase获取子集合数据?

时间:2021-05-02 11:49:17

标签: firebase flutter dart google-cloud-firestore

我正在尝试一起计算一些数据。我拥有的是一个视频集合,然后每个视频都有一个文档 ID,然后是一些字段,例如上传此视频的用户的 uid。而且每个视频都有一个名为 uservotes 的子集合。在他们的内部,我保存了用户对该视频的投票。这是它的样子

enter image description here

enter image description here

enter image description here

而我想要的是获得一个用户,用户投票评分字段一起计算。 这是我如何获得一个视频的评级,这可能有助于理解

FutureBuilder(
                                      future: firebase,
                                      builder:
                                          (BuildContext context, snapshot) {
                                        if (snapshot.connectionState ==
                                            ConnectionState.waiting) {
                                          return Center(
                                              child: Text("loading..."));
                                        } else {
                                          double summe = 0.0;
                                          final docs = snapshot.data.docs;

                                          for (int i = 0;
                                              i < docs.length;
                                              i++) {
                                            summe += (docs[i]['rating']);
                                            print(summe);
                                          }
                                          final possiblestars = docs.length * 5;
                                          print(possiblestars);

                                          return Text(
                                            "${summe.toInt()}/${possiblestars}",
                                            style: TextStyle(
                                                color: Colors.white,
                                                fontWeight: FontWeight.bold,
                                                fontSize: 18),
                                          );
                                        }
                                      }),

firebase 流就是这个

   var firebase = FirebaseFirestore.instance
                      .collection('videos')
                      .doc(videos.data()['id'])
                      .collection('uservotes')
                      .get();

因此,我希望获得来自同一用户的所有视频的所有用户投票,而不是获得一个视频的所有用户投票。您可以看到视频集合中的每个视频都有 uid 字段,这就是上传视频的用户的 uid 我可以通过该字段获取当前用户 id

  final uid=   FirebaseAuth.instance.currentUser.uid;

每个将这个 uid 保存为 uid 值的视频都是我需要的视频之一 .然后我想得到每个视频的子集合用户投票所有评级来计算它们。不要对用户投票集合中的相同 uid 文档感到困惑,因为上传此当前视频的用户也会对自己的视频进行评分。 希望任何人都可以提供帮助。

2 个答案:

答案 0 :(得分:0)

不幸的是,在单个查询中这是不可能的。您应该先获取所有视频,然后为每个视频重新调用以获取子集。

答案 1 :(得分:0)

根据您的要求,使用您的数据模型,您需要使用相同的 videos 查询所有 uid 文档,然后对于每个文档,查询 < strong>all uservotes 子集合的文档。

您可以通过将视频所有​​者 uid 添加到 uservotes 文档并使用 collectionGroup 查询来简化此查询。

但是,根本不建议在每次要获取文档数量时查询整个(子)集合,因为您需要为阅读的每个文档付费。所以它可以非常快速地生成一个重要的账单...

您应该为每个用户(也许还为每个视频?)维护一个计数器。为此,最好使用 distributed counters。我建议使用 Cloud Functions 更新计数器,这样最终用户就无法修改计数器。