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

如何从firebase获取子集合数据?,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我正在试图计算一些数据。我有一个视频集合,然后每个视频都有一个文档id,然后是一些字段,例如上传此视频的用户的uid。而且每个视频都有一个名为uservotes的子集合。在他们的视频中,我保存了该视频的用户投票。这就是它的样子 我想要的是得到一个用户,用户投票率字段一起计算。 下面是我如何得到一个视频的评级,也许这将有助于理解 FutureBuilder( future: firebase,

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

我想要的是得到一个用户,用户投票率字段一起计算。 下面是我如何得到一个视频的评级,也许这将有助于理解

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),
                                          );
                                        }
                                      }),
因此,我不想获得一个视频的所有用户投票,而是想获得来自同一用户的所有视频的所有用户投票。你可以看到视频集合中的每个视频都有uid字段,这是上传视频的用户的uid,我可以用它获取当前用户id

  final uid=   FirebaseAuth.instance.currentUser.uid;
在videoscollction中将这个uid保存为uid值的每个视频都是我需要的视频中的一个 . 然后,我想得到每个视频的子集合用户投票所有评级,以计算它们在一起。不要对用户投票集合中的相同uid文档感到困惑,因为上传当前视频的用户也会对自己的视频进行评分。
希望任何人都能帮上忙。

不幸的是,一次查询是不可能的。您应该首先获取所有视频,然后对每个视频进行新的调用以获取子集合。

根据您的要求,使用您的数据模型,您需要查询所有具有相同
uid
视频
文档,然后,对于每个文档,查询all用户投票
子集合的文档

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

但是不建议每次要获取文档数量时都查询整个(子)集合,因为您阅读的每个文档都会收到账单。所以它可以很快生成一张重要的账单


您应该为每个用户维护一个计数器(可能还有每个视频?)。为此,最好的方法是使用。我建议使用云功能来更新计数器,这样最终用户就无法修改计数器。

是否有更简单的方法?是否应该保存用户投票收集数据,而不是像现在这样保存在自己的收集中?您仍然需要查询整个(子)集合每次要获取其中的文档数时,都要收集。您的选择取决于您希望在集合和。。。您银行账户上的金额;-)如果我像这样做FirebaseFirestore.instance.collection('UserVoces').doc(uid).collection(“videos”).doc(id).set({'videoid':id,'rating':_rating,'uid':uid});请看我上面的评论。但是为什么我必须查询整个(子)集合呢。我可以用FirebaseFirestore.instance.collection('uservoates').doc(uid)获取数据,然后进行查询我不明白你为什么说我必须查询整个子集合
  final uid=   FirebaseAuth.instance.currentUser.uid;