如何正确统计Firestore集合中pendingDocumentWrites的总数量
核心问题
你当前统计逻辑的错误根源是错误使用了getDocumentChanges()接口:
getDocumentChanges()返回的是本次快照与上一次快照相比发生变更的文档增量集合,不是当前查询匹配到的全量文档- 每次你新增1条待发送消息时,本次快照触发时变更列表里只有这1条新写入的pending状态文档,再加上你每次回调里都把
count初始化为0,最终统计结果自然只会是1
修复方案
推荐两种修复方式,可根据业务需求选择:
方案1:全量统计(实现最简单,数据量不大时优先选)
直接遍历当前快照返回的全量文档统计pending数量,不用处理增量逻辑:
listener = firestore.collection("Chats").orderBy("timestamp", Query.Direction.DESCENDING).addSnapshotListener((value, error) -> { // 先处理异常,避免空指针崩溃 if (error != null || value == null) { return; } int count = 0; // 遍历全量文档,不是变更集合 for (DocumentSnapshot doc : value.getDocuments()) { if (doc.getMetadata().hasPendingWrites()) { count++; } else { // 原有其他逻辑 } } setCounter(count); });
方案2:增量统计(性能更高,适合文档数量多的场景)
把count提升为全局成员变量,根据变更类型做增量加减,不用每次遍历全量文档:
// 全局成员变量,不要在回调里初始化 private int pendingCount = 0; // 初始化监听器的逻辑 listener = firestore.collection("Chats").orderBy("timestamp", Query.Direction.DESCENDING).addSnapshotListener((value, error) -> { if (error != null || value == null) { return; } for(DocumentChange change : value.getDocumentChanges()){ boolean isPending = change.getDocument().getMetadata().hasPendingWrites(); switch (change.getType()) { case ADDED: if (isPending) pendingCount++; break; case MODIFIED: // 修改前的旧文档如果是pending要先减,再判断新文档状态加 boolean oldPending = change.getOldDocument().getMetadata().hasPendingWrites(); if (oldPending) pendingCount--; if (isPending) pendingCount++; break; case REMOVED: if (isPending) pendingCount--; break; } } setCounter(pendingCount); });
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

