android - Android Firebase Firestore SDK:如何根据另一个集合的文档字段从集合中排序文档?
问题描述
我的想法是为帖子创建一个喜欢和不喜欢的系统(用户可以喜欢和不喜欢帖子)并在片段中显示用户列表,按以下方式排序:顶级用户是最多喜欢的用户。
在我的 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”。
解决方案
您尝试做的本质上是“加入”类型的操作,Firestore 不支持该操作。Firestore 查询一次只能考虑单个集合中的文档。如果您有来自两个集合的数据用于生成查询结果,您将至少有两个查询要执行。
您唯一真正的选择是引入第三个集合,其中的数据已经从支持您要进行的查询的其他两个集合中合并。这在 NoSQL 类型的数据库中很常见,称为“非规范化”。
推荐阅读
- c# - c# 将字符串“10101010”转换为小数
- javascript - 我无法收到全名警报
- angular - 通过库 ng-multiselect-dropdown 构建 Angular 时出错
- ubuntu - 多个 RocksDB 实例能否超过系统的 max_open_files 值?
- artificial-intelligence - 弃用警告:调用已弃用的`__getitem__`
- ios - 带有 SpriteKit 的着色器仅注册黑色的 alpha
- python - python中的循环导入问题。如何解决?
- django-models - 没有这样的列:app_entry.author_id
- ruby-on-rails - 如何在 Rails 视图中显示部分使用 JS?
- python - np.loadtxt 文件语法问题