如何区分Firestore查询中快照监听器的REMOVE事件触发原因?
区分Firestore REMOVE事件的两种触发场景
你的查询快照监听器会在两种场景触发REMOVE事件,要区分它们,可以试试以下几种方法:
方法1:优化现有文档查询方案
你当前通过docId调用get()的思路可行,可优化为缓存优先读取来减少不必要的网络请求:
// 处理REMOVE事件时 DocumentSnapshot freshDoc = firestore.collection("...").document(docId).get(Source.CACHE).get(); if (freshDoc.exists()) { boolean stillAvailable = freshDoc.getBoolean("available"); if (stillAvailable) { // 场景2:文档因新数据加入被挤出limit范围 } else { // 场景1:文档因available设为false被过滤 } } else { // 文档被物理删除的场景(若存在) }
如果缓存中无最新数据,Firestore会自动 fallback 到网络请求,这个方法能准确判断触发原因。
方法2:结合ADDED事件联动判断
如果REMOVE事件发生时,同时伴随ADDED事件(新数据加入),且新增文档的sort值符合降序排序规则(比被移除文档的sort值更高),则大概率是新数据挤出旧数据的场景;如果只有单独的REMOVE事件,则更可能是文档被标记为不可用。
这种方法无需额外网络请求,但要注意:若同时有多个文档更新(比如多组ADDED/REMOVE事件),需结合排序逻辑仔细校验,避免误判。
方法3:添加辅助标记字段(备选)
在将文档available设为false时,额外添加removedByUser: true的标记字段;后续处理REMOVE事件时,通过获取的最新文档是否存在该标记来区分场景。不过这种方法会增加数据冗余,仅在其他方法不适用时考虑。
内容的提问来源于stack exchange,提问作者Dark White
相关产品推荐
相关产品推荐

