如何用Firebase开发类Twitter混合排序算法?解决Firestore去重与实时更新
基于Firebase实现类Twitter混合排序算法的去重问题
我希望借助Firebase开发一款类似Twitter的混合排序算法,基于weight和created_at参数从Firestore中检索并排序讨论内容。
我的讨论集合结构如下:
interface Discussion { weight: number; created_at: ServerTimeStamp; }
挑战
Firestore仅支持单字段排序,存在明显局限性:例如仅按weight排序讨论,新发布的内容将永远无法提升排名。
如果我尝试分别按weight和created_at排序查询讨论内容,该如何有效处理去重问题?需要注意的是,讨论文档数量可能在0到100万之间,因此我希望避免将所有文档加载到客户端。此外,所有变更需支持响应式更新,并使用onSnapshot方法实现实时更新。
示例场景
以下是当前的查询实现代码:
interface Discussion { weight: number; created_at: ServerTimeStamp; } async function queryDiscussionFromFireStore () { const col_ref = collection("discussion") // 查询高权重讨论 const topPost_unSub = onSnapshot(query(col_ref, orderBy("weight")), (snapShot) => { setState(snapShot.docs.map(d => d.data() as Discussion)); }) // 查询最新讨论 const recentPost_unSub = onSnapshot(query(col_ref, orderBy("created_at")), (snapShot) => { setState(snapShot.docs.map(d => d.data() as Discussion)); }) return () => { recentPost_unSub() topPost_unSub() }; }
该函数可以正常运行,但无法解决数据去重问题。
假设有以下测试数据:
[ { weight: 5, created_at: today_date }, { weight: 3, created_at: today_date }, ]
在这种情况下,两个snapShot会返回相同的数据,导致重复条目被处理。
问题细节
上述代码中,queryDiscussionFromFirestore函数通过两种排序规则(按weight、按created_at)从Firestore检索讨论内容,并使用onSnapshot方法监听实时更新。但存在数据重复问题:如果多个讨论具有相同的created_at时间戳,“高权重讨论”查询和“最新讨论”查询会返回相同的数据,进而导致重复条目被处理。
内容的提问来源于stack exchange,提问作者user20985280
相关产品推荐
相关产品推荐

