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

如何使用where()查询Firestore符合条件的文档并统计数量,查询无返回如何解决

问题排查与解决方案
  • 依赖项缺失导致查询时机错误
    你当前useEffect的依赖数组为空,只会在组件首次挂载时执行一次getData。如果此时用户还未完成选择,selected是初始空值,where过滤条件匹配不到任何Firestore文档,返回的snapshot为空,forEach遍历不会执行,自然不会打印doc.data()也不会触发setSize更新。
    修正方案:将selected加入useEffect依赖数组,仅在selected有有效值时触发查询:
useEffect(() => {
  if (selected) {
    getData();
  }
}, [selected]);
  • state初始化逻辑错误,无length属性
    你初始化size为数字0,数字类型不存在length属性,所以console.log(size.length)永远输出undefined。同时如果查询匹配到多个文档,你在forEach中反复调用setSize会覆盖之前的值,最终size只会保留最后一个匹配文档的数据。
    修正方案:如果要存储所有匹配文档数据,将state初始化为数组,遍历后统一更新:
// 初始值改为空数组
const [size, setSize] = useState([])

const getData = async () => {
  const citiesRef = firestore.collection("users");
  const snapshot = await citiesRef
    .where("item.itemName", "==", selected)
    .get();
  const result = []
  snapshot.forEach((doc) => {
    console.log('匹配文档数据:', doc.data())
    result.push(doc.data())
  });
  setSize(result)
};
  • 缺少错误捕获,异常情况无日志
    你没有给异步请求增加异常捕获逻辑,如果Firestore安全规则禁止读取users集合、或者网络异常,查询会直接失败,不会输出任何日志。
    修正方案:增加try/catch捕获异常,同时提前判断snapshot是否为空:
const getData = async () => {
  try {
    const citiesRef = firestore.collection("users");
    const snapshot = await citiesRef
      .where("item.itemName", "==", selected)
      .get();
    if (snapshot.empty) {
      console.log('未匹配到任何符合条件的文档')
      return
    }
    const result = []
    snapshot.forEach((doc) => {
      console.log('匹配文档数据:', doc.data())
      result.push(doc.data())
    });
    setSize(result)
    console.log('最终查询结果长度:', result.length)
  } catch (err) {
    console.error('查询失败,错误信息:', err)
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:15:04