我正在尝试一起计算一些数据。我拥有的是一个视频集合,然后每个视频都有一个文档 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),
);
}
}),
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 文档感到困惑,因为上传此当前视频的用户也会对自己的视频进行评分。 希望任何人都可以提供帮助。
答案 0 :(得分:0)
不幸的是,在单个查询中这是不可能的。您应该先获取所有视频,然后为每个视频重新调用以获取子集。
答案 1 :(得分:0)
根据您的要求,使用您的数据模型,您需要使用相同的 videos
查询所有 uid
文档,然后对于每个文档,查询 < strong>all uservotes
子集合的文档。
您可以通过将视频所有者 uid
添加到 uservotes
文档并使用 collectionGroup 查询来简化此查询。
但是,根本不建议在每次要获取文档数量时查询整个(子)集合,因为您需要为阅读的每个文档付费。所以它可以非常快速地生成一个重要的账单...
您应该为每个用户(也许还为每个视频?)维护一个计数器。为此,最好使用 distributed counters。我建议使用 Cloud Functions 更新计数器,这样最终用户就无法修改计数器。