Firebase Firestore存储列表的最优方法及正确获取数组长度的方案
Firestore存储点赞用户列表及正确获取长度方案
你当前的需求是存储特定对象的点赞用户ID列表,同时获取点赞总数,存储的列表结构如下图:
现有代码错误原因
你当前的实现逻辑错误在于:直接将Firestore返回的数组对象转为字符串后取字符串本身的字符长度,而非数组的元素个数。比如包含2个元素的数组["uid1", "uid2"]转为字符串后结果为"[uid1, uid2]",字符长度刚好为8,和你遇到的错误返回结果完全匹配。
最优实现方案
1. 存储侧设计
可根据业务场景选择两种存储方案:
- 轻量场景(单对象点赞量低于1万):直接保留
userLikedOfferList数组字段,元素存储点赞用户ID,符合你当前的存储结构 - 高并发/高点赞量场景:额外新增
likeCount数字类型字段,用户点赞/取消点赞时,通过Firestore提供的FieldValue.increment()原子操作增减计数,避免数组并发写入冲突
2. 读取侧实现
方案1:直接读取数组长度(适配你现有存储结构)
Firestore SDK会自动将数组字段转为Kotlin List类型,无需自定义解析方法,直接获取List的size即可:
// mapper层代码直接替换原有逻辑即可 val likedList = it["userLikedOfferList"] as? List<String> ?: emptyList() val likes = likedList.size.toString()
方案2:读取独立计数字段(高并发场景推荐)
如果使用了独立计数字段,直接读取该字段值即可,无需拉取全量数组,性能更高:
val likes = it.getLong("likeCount").toString()
注意事项
点赞量较高的业务优先选择独立计数字段方案,既可以避免拉取全量数组产生的不必要带宽消耗,也能降低数组并发写入的冲突概率。
内容的提问来源于stack exchange,提问作者Wafi_ck
相关产品推荐
相关产品推荐

