Android Firebase 如何实现equalTo过滤后按其他子字段排序
Firebase单条件筛选+排序查询问题解法
Firebase Realtime Database 确实限制单条查询只能调用一次排序类方法,要实现你的需求有两种可行方案:
方案1:调整数据结构(推荐,性能最优)
在每个帖子的存储字段中新增一个组合索引字段,比如命名为 userid_negativets,字段值为 {用户ID}_{负时间戳},拼接两个你需要筛选、排序的字段值。
之后直接用单次orderByChild即可同时完成筛选和排序:
Query query = reference .child("Posts") .orderByChild("userid_negativets") .startAt(given_user_id + "_") .endAt(given_user_id + "_\uf8ff");
相关说明:
- 后缀
\uf8ff是高编码Unicode字符,用来匹配所有以{given_user_id}_开头的字段值,刚好可以过滤出指定用户的全部帖子 - 因为组合字段后半段是负时间戳,查询返回的结果天然会按照发布时间倒序排列,符合需求
方案2:客户端本地排序(适合小数据量场景)
如果你不想改动现有数据结构,可以先按用户ID过滤出所有匹配的帖子,拿到结果后在客户端内存中按时间戳字段排序:
Query query = reference .child("Posts") .orderByChild("user_id") .equalTo(given_user_id); // 给query添加监听器拿到返回数据后,遍历集合按negative_timestamp字段做本地排序即可
该方案仅适合单个用户发帖量不多的场景,如果单用户帖子数量过大会增加客户端内存占用和加载耗时。
内容的提问来源于stack exchange,提问作者lukasniessen
相关产品推荐
相关产品推荐

