Android Firebase Firestore SDK:如何根据另一个集合的文档字段从集合中订购文档?

时间:2020-04-13 19:15:22

标签: android firebase google-cloud-firestore

我的想法是为帖子创建一个类似/不相似的系统(用户可以喜欢和不喜欢一个帖子),并按以下顺序显示片段中的用户列表:最高用户是拥有最多用户的系统很多喜欢。

在我的Firebase Firestore数据库中:

  • 我有一组帖子。每个文档(即帖子)都包含创建该文档的用户的ID,以及一个“喜欢”的计数器(我称其为“ A”)。

  • 我有另一个用户集合。每个文档(是用户)都包含一个计数器(我称其为“ B”),该计数器计算喜欢的次数(所有帖子的总和)。

目前,我使用“ B”在上述用户列表中对用户进行排序。我这样使用“ B”:return FirebaseFirestore.getInstance().collection("users").orderBy("likes", Query.Direction.DESCENDING);

但是,由于与Firebase安全规则有关的一些技术事实,并且为了简化数据库结构,我只想使用“ A”并删除“ B”。更准确地说,我希望得到所有用户,并根据“ A”对其进行订购。但是,计数器“ A”是在帖子集合的文档中定义的,而计数器“ B”是在用户集合的文档中定义的:这使它更易于使用。

所以我的问题是:对于每个用户,我将必须获取他们的所有帖子,然后总结其计数器“ A”,然后获取所有用户,然后根据该总和对其进行排序。 但是,我想知道:是否可以使用Firebase Firestore Android API做到这一点?(类似于之前给出的说明)换句话说:如何从集合中订购文档, 但是请注意,实际上这要困难得多,因为我必须对用户创建的每个帖子的计数器“ A”进行汇总。

1 个答案:

答案 0 :(得分:2)

您要执行的操作实际上是“连接”类型的操作,Firestore不支持此操作。 Firestore查询一次只能考虑单个集合中的文档。如果您有两个集合中的数据可用于生成查询结果,则至少要执行两个查询。

您唯一真正的选择是引入第三个集合,其中的数据已经从其他两个集合中合并而来,这些数据支持您要进行的查询。这在NoSQL类型数据库中很常见,称为“反规范化”。