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

Android端Cloud Firestore如何使用逻辑AND查询并正确添加计数到数组

问题根因

两个问题的诱因非常明确:

  1. Firestore的get()是异步非阻塞操作,调用后会立刻执行后续的同步代码,不会等待查询结果返回。你写在addOnSuccessListener外部的man.add()执行时,查询还没拿到结果,c始终是初始值0,自然无法存入正确计数。
  2. Firestore链式调用多个whereEqualTo时,默认就是按逻辑AND叠加所有筛选条件,不需要额外写AND语法。你觉得ctrApproved2、ctrApproved的空值筛选没生效,本质是匹配值和文档实际存储值不匹配:如果文档里这两个字段存的是null、或者字段本身不存在,用whereEqualTo(字段名, "")(匹配空字符串)是无法命中的,最终结果看起来就像只生效了m字段的筛选条件。
修复后代码
obj.setUid(d.getId().toString());
db.collection("individuals")
        .whereEqualTo("m", obj.getUid())
        // 若文档中对应空值为null,将第二个参数从""替换为null即可,null条件可同时匹配字段值为null、字段不存在的文档
        .whereEqualTo("ctrApproved2", "")
        .whereEqualTo("ctrApproved", "")
        .get()
        .addOnSuccessListener(queryDocumentSnapshots -> {
            int c = queryDocumentSnapshots.size();
            Log.d("Length", String.valueOf(c));
            // 所有依赖查询结果的逻辑必须放在回调内部执行,此时拿到的c才是真实的符合条件的文档数
            man.add(obj.getUid() + " (" + c + ")");
        })
        .addOnFailureListener(e -> {
            // 补充失败监听,方便快速定位权限、索引缺失类查询错误
            Log.e("FirestoreQuery", "查询执行失败", e);
        });
关键提示
  • 所有需要用到异步查询结果的逻辑,必须写在对应的成功回调内部,不要在回调外部使用回调内赋值的变量,这类变量的赋值时机晚于外部同步代码执行,永远拿不到最新值。
  • 配置空值筛选前,先到Firestore控制台确认目标字段的实际存储值:空字符串""和null是完全不同的匹配目标,传错参数就会导致筛选结果不符合预期。

内容的提问来源于stack exchange,提问作者Vikas Konaparthi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:09:10