如何使用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
相关产品推荐
相关产品推荐

