You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:15:04