Firebase Realtime Database如何按子节点下属子级数量对评论排序
问题解答
Firebase Realtime Database 不支持直接根据子节点的数量在服务端进行排序查询,你当前的数据结构无法直接实现按点赞数排序拉取评论的需求,必须调整实现方案。
最优解决方案:新增冗余点赞数字段
这是官方推荐的标准实现方式,你只需要在每个评论节点下新增一个likeCount数值类型的子字段,在用户执行点赞/取消点赞操作时同步更新该字段即可:
- 点赞时使用原子递增操作避免并发计数错误:
ServerValue.increment(1) - 取消点赞时使用原子递减操作:
ServerValue.increment(-1)
调整后的数据结构示例:
{ "users" : { "$uid" : { "posts" : { "$postID" : { "postText" : "blah blah blah", "comments" : { "$commentID" : { "commentText" : "blah blah blah", "likeCount": 3, "likes" : { "UID01" : "1622035190516", "UID02" : "1622036141955", "UID03" : "1622036145134" } } } } } } } }
之后你就可以直接通过orderByChild('likeCount')实现按点赞数排序,若要实现从高到低的倒序排序,可结合limitToLast拉取后反转列表,或者直接在客户端对查询结果做倒序处理即可,同时还能支持分页查询。
不推荐的替代方案:客户端手动排序
如果你暂时不想调整数据结构,只能把对应帖子下的所有评论全量拉取到本地,遍历每个评论节点统计likes的子节点数量,再手动对评论列表做排序。
该方案仅适用于评论数极少的场景,缺点非常明显:
- 评论量稍大时会浪费大量带宽,拉取性能极低
- 无法实现分页查询,数据量越大体验越差
内容的提问来源于stack exchange,提问作者brandbei37
相关产品推荐
相关产品推荐

