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

如何正确统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:36:03